如何在javascript中展平嵌套数组?
如何在javascript中展平嵌套数组?
此问题已经有答案了:
我们知道,通过使用 reduce()
方法可以将数组 [[0, 1], [2, 3], [4, 5]]
扁平化。
var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) { return a.concat(b); });
那么如何将数组 [[[0], [1]], [[2], [3]], [[4], [5]]]
扁平化为 [0, 1, 2, 3, 4, 5]
呢?
admin 更改状态以发布 2023年5月20日
递归的使用场景很完美,它甚至可以处理更深的结构:
function flatten(ary) { var ret = []; for(var i = 0; i < ary.length; i++) { if(Array.isArray(ary[i])) { ret = ret.concat(flatten(ary[i])); } else { ret.push(ary[i]); } } return ret; } flatten([[[[[0]], [1]], [[[2], [3]]], [[4], [5]]]]) // [0, 1, 2, 3, 4, 5]
或者作为数组的方法:
Array.prototype.flatten = function() { var ret = []; for(var i = 0; i < this.length; i++) { if(Array.isArray(this[i])) { ret = ret.concat(this[i].flatten()); } else { ret.push(this[i]); } } return ret; }; [[[[[0]], [1]], [[[2], [3]]], [[4], [5]]]].flatten() // [0, 1, 2, 3, 4, 5]
编辑#1:好吧,思考一下函数式的方法(除了使用Y组合子的命名递归外:d)。
function flatten(ary) { return ary.reduce(function(a, b) { if (Array.isArray(b)) { return a.concat(flatten(b)) } return a.concat(b) }, []) }
让我们采用一些ES6语法,使它更短,只需一行。
const flatten = (ary) => ary.reduce((a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), [])
但是请记住,这个无法作为数组方法应用,因为箭头函数没有自己的this
。
编辑#2:随着最新的Array.prototype.flat
提案,这变得非常简单。数组方法接受一个可选参数depth
,指定要展开多少层嵌套的数组结构(默认为1
)。
[[[[[0]], [1]], [[[2], [3]]], [[4], [5]]]].flat() // [[[[0]], [1]], [[[2], [3]]], [[4], [5]]] [[[[[0]], [1]], [[[2], [3]]], [[4], [5]]]].flat(2) // [[[0]], [1], [[2], [3]], [4], [5]] [[[[[0]], [1]], [[[2], [3]]], [[4], [5]]]].flat(3) // [[0], 1, [2], [3], 4, 5] [[[[[0]], [1]], [[[2], [3]]], [[4], [5]]]].flat(4) // [0, 1, 2, 3, 4, 5]
所以要展平任意深度的数组,只需使用Infinity
调用flat
方法。
[[[[[0]], [1]], [[[2], [3]]], [[4], [5]]]].flat(Infinity) // [0, 1, 2, 3, 4, 5]