<分区>
正如我们所知,通过使用方法 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]
?
标签 javascript arrays
<分区>
正如我们所知,通过使用方法 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]
?
最佳答案
递归的完美用例,可以处理更深层次的结构:
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-combinator 来实现纯函数式 :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), [])
但是请记住,这个不能作为数组方法应用,因为arrow functions没有他们自己的 this
。
编辑 #2:使用最新的 Array.prototype.flat
提案,这非常容易。 array 方法接受一个可选参数 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]
关于javascript - 如何在 javascript 中展平嵌套数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27266550/
相关文章:
javascript - 用js获取html源码相关的选中html元素偏移量
javascript - JavaScript 数组文字定义中逗号后的值是什么?
javascript - Observable 中的 Async/Await
c++ - cocos2d-x:来自另一个类的 CRUD 二维数组
javascript - 我应该怎么做才能通过 Servlet 在另一个 JSP 页面的 <div> 标记中加载一个 JSP 页面?
javascript - JS/ES6 : Check if every array element has a child in another array
javascript - 如何使用 `if` 条件和分隔符拆分字符串