网上的数组降维方法有很多,大多写的又长又难懂,这里总结了三种优雅高效的方法,如果有更好的方法,欢迎评论区留言,大家一起探讨进步
<script>
const arr = [1,[2,3,[4,5,"今晚",[6,'吃','什','么']]],{name: 'tom'}];
/**
* 适用于数值类型的多维数组降维
* arr + '' 可以隐式转换为字符串类型,本质是调用了String()方法
* +/- item 可以隐式转换为数值类型,会改变数值的正负性,本质是调用了Number()方法
* Array.filter(Boolean)可以去除数组中的虚值(undefined、null、NaN、0、''、false),很好用
* */
const arrToString = arr + '';
const stringArr = arrToString.split(',');
const numberArr = stringArr.map(item => +item);
console.log(arrToString); // "1, 2, 3, 4, 5, 今晚, 6, 吃, 什, 么, [object Object]"
console.log(stringArr); // ["1", "2", "3", "4", "5", "今晚", "6", "吃", "什", "么", "[object Object]"]
console.log(numberArr); // [1, 2, 3, 4, 5, NaN, 6, NaN, NaN, NaN, NaN]
console.log(numberArr.filter(Boolean)); // [1, 2, 3, 4, 5, 6]
/**
* 万能的方法,什么类型的多维数组都行,降维后不改变元素的类型,可以封装成工具类使用
* instanceof用于判断一个变量是否是某个对象的实例
* js的基本数据类型(Number、String、Boolean、undefined、null、symbol(ES6新增))
* js的引用数据类型 Object(包含Array、Function等)
*
* 遍历第一次:[1,[2,3,[4,5,"今晚",[6,'吃','什','么']]],{name: 'tom'}] instanceof Array // true 递归
* 遍历第二次:1 instanceof Array // false ret.push(1)
* 遍历第三次:[2,3,[4,5,"今晚",[6,'吃','什','么']]] instanceof Array // true 递归
* ....
* 遍历最后一次:{name: "tome"} instanceof Array // false ret.push({name: "tome"})
* */
function flatten(arr){
let ret = [];
let forFlat = (arr) => arr.forEach(item => item instanceof Array ? forFlat(item) : ret.push(item));
forFlat(arr);
return ret;
}
console.log(flatten(arr)); // [1, 2, 3, 4, 5, "今晚", 6, "吃", "什", "么", {name: "tom"}]
/**
* 究极牛逼的方法,Array.flat(Infinity)展开任意深度的嵌套数组(ES6)
* 如果不考虑兼容问题,这种方法或许是最好的,上面↑的方法可以对遍历的数据进行操作,这个只返回结果,具体看实际需求选择
* */
console.log(arr.flat(Infinity)); // [1, 2, 3, 4, 5, "今晚", 6, "吃", "什", "么", {name: "tom"}]
</script>