数组扁平化就是把多维数组转化成一维数组。
1、flat
arr.flat([depth]) 创建一个新的阵列的所有子阵元件连接到它递归到指定的深度。不改变原数组。【ES6】
在浏览器支持的情况下最好用这个。
//var newArray = arr.flat([depth]);
//depth : 深入水平
var arr_ = ['a',['a','b',['c','d',['1','3']],'e'],'f',['g',['h']]];
console.log(arr_.flat());
//Array(8) [ "a", "a", "b", (3) […], "e", "f", "g", (1) […] ]
console.log(arr_.flat(1));
//Array(8) [ "a", "a", "b", (3) […], "e", "f", "g", (1) […] ]
console.log(arr_.flat(2));
//Array(10) [ "a", "a", "b", "c", "d", (2) […], "e", "f", "g", "h" ]
console.log(arr_.flat(Infinity));
//Array(11) [ "a", "a", "b", "c", "d", "1", "3", "e", "f", "g", … ]
2、reduce
reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
- total : 必需。初始值, 或者计算结束后的返回值。
- currentValue : 必需。当前元素 。
- currentIndex : 可选。当前元素的索引
- arr : 可选。当前元素所属的数组对象。
- initialValue : 可选。传递给函数的初始值.
- 提供了initialValue 的值的时候,total为initialValue 的大小,currentValue为数组的第一个元素值
- 没有提供initialValue 的值的时候,total为数组第一个元素的值,currentValue为第二个元素的值,此后每执行一次,total 为return的值。
var arr_ = ['a',['a','b',['c','d',['1','3']],'e'],'f',['g',['h']]];
//传递一个空数组,作为遍历开始
var flatting = arr => {
return arr.reduce((pre, cur) => {
return pre.concat(Array.isArray(cur) ? flatting(cur) : cur)
},[])
}
flatting(arr_);
3、递归
var arr_ = ['a',['a','b',['c','d',['1','3']],'e'],'f',['g',['h']]];
var flatting = arr => {
var nArr = [];
for (var i = 0; i < arr.length; i++) {
if(Array.isArray(arr[i])) {
nArr = nArr.concat(flatting(arr[i]));
flatting[arr[i]];
} else {
nArr.push(arr[i]);
}
}
return nArr;
}
console.log(flatting(arr_));
4、some
var arr_ = ['a',['a','b',['c','d',['1','3']],'e'],'f',['g',['h']]];
var flatting = arr => {
while(arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}
console.log(flatting(arr_));