js实现数组扁平化
数组的扁平化,就是将一个嵌套多层的数组array(嵌套可以是任何层数)转换为只有一层的额数组。
如:
var arr = [3,5,[7,3,[22,11],6],4];
//扁平化后:[3, 5, 7, 3, 22, 11, 6, 4]
-
法一 递归实现
var arr = [3,5,[7,3,[22,11],6],4];
//法一 递归
function flatten1(arr) {
var newArr = [];
for(var i = 0; i < arr.length; i++) {
//if(Array.isArray(arr[i])) { 或
if(typeof arr[i] == 'object') {
newArr = newArr.concat(arguments.callee(arr[i]));
//或 newArr = newArr.concat(flatten1(arr[i]));
} else {
newArr.push(arr[i]);
}
}
return newArr;
}
console.log(flatten1(arr));// [3, 5, 7, 3, 22, 11, 6, 4]
-
法二 reduce方法
//法二 reduce方法
function flatten2(arr) {
return arr.reduce(function(prev, item) {
return prev.concat(typeof item == 'object' ? flatten2(item) : item);
}, []);
}
console.log(flatten2(arr));
-
法三 toString方法
//法三 toString方法
//如果数组的元素都是数字,那么我们可以考虑使用 toString 方法
function flatten3(arr) {
return arr.toString().split(',').map(function(item) { //toString之后再split转成数组,并将其转换回数字:
return +item; //将字符串转为数字
})
}
console.log(flatten3(arr));
-
法三 ES6扩展运算符
//法四 ES6扩展运算符
function flatten4(arr) {
while(arr.some(item =>Array.isArray(item))){
arr = [].concat(...arr);
}
return arr;
}
flatten4(arr);
- 由于扩展运算符一次只能展开一层数组:
var arr = [1, [2, [3, 4]]];
console.log([].concat(...arr)); // [1, 2, [3, 4]]