多级数组扁平化处理
扁平化,就是将一个嵌套多层的数组 array (嵌套可以是任何层数)转换为只有一层的数组(不改变原数组,所以不能用push添加到现有阵列)
以下函数都是建立在arr是数组的前提下,函数仅供参考,没有做过多判断传参
ES6 扩展运算符 …
var arr = [1, [2, [3, 4]]];
function flatten(arr) {
while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}
console.log(flatten(arr))
ES5
高级写法:
var arr = [1, [2, [3, 4]]];
flatten1 = Function.apply.bind([].concat, []); //重要步骤
function flatten(arr) {
while (arr.some(item => Array.isArray(item))) {
arr = flatten1(arr);
}
return arr;
}
console.log(flatten(arr))
常规写法
var arr = [1, [2, [3, 4]]];
function flatten(arr) {
return arr.reduce(function(prev, next){
return prev.concat(Array.isArray(next) ? flatten(next) : next)
}, [])
}
console.log(flatten(arr))
递归
var arr = [1, [2, [3, 4]]];
function flatten(arr) {
var result = [];
for (var i = 0, len = arr.length; i < len; i++) {
if (Array.isArray(arr[i])) {
result = result.concat(flatten(arr[i]))
}
else {
result.push(arr[i])
}
}
return result;
}
console.log(flatten(arr))
高级写法分析
Function.apply.bind([].concat, [])
// 相当于
function(arg) {
return Function.apply.call([].concat, [], arg)
}
// 相当于
function(arg) {
return [].concat.apply([], arg)
}
到这里应该明白怎么回事了,不清楚可以去看先Function.prototype.apply()
// 相当于
function(arg) {
return [].concat(...arg)
}
JavaScript专题之数组扁平化:https://github.com/mqyqingfeng/Blog/issues/36