我需要帮助压平这样的数组:
[1,2,[2,3],[5,[6,1],4],7]
我希望它像
[1,2,2,3,5,6,1,4,7].
我搜索过类似的东西,找到了[].concat.apply
,但它只处理二维数组。
我还想使用一种适用于任何锯齿状多维数组的算法。请帮忙。Thx
我的建议是依赖lodash并使用flattenDeep
函数。
_.flattenDeep([1,2,[2,3],[5,[6,1],4],7])
// [ 1, 2, 2, 3, 5, 6, 1, 4, 7 ]
如果你想编写自己的函数,你可能想看看lodash的实现。
在伪代码中,这里有一种递归方法:
result = []
function flatten(array)
for each element in array
if element is array
flatten(element)
else
result.append(element)
编辑
这是一种"手工"的方法,不过我绝对建议使用经过更好测试的lodash实现。
function flatten(arr, result) {
if (result === undefined) {
result = [];
}
for (var i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
flatten(arr[i], result);
} else {
result.push(arr[i]);
}
}
return result;
}
console.log(flatten([1, 2, [2, 3], [5, [6, 1], 4], 7]));
// Output:
// [ 1, 2, 2, 3, 5, 6, 1, 4, 7 ]
您可以将concat.apply
封装在一个循环中以处理深度嵌套的数组:
while (a.some(Array.isArray))
a = [].concat.apply([], a)
或者在ES6语法中:
while (a.some(Array.isArray))
a = [].concat(...a);