const arr1 = [0, 1, 2, [3, 4]];
// 预期得到: [0, 1, 2, 3, 4]
const arr2 = [0, 1, 2, [[[3, 4]]]];
// 预期得到: [0, 1, 2, 3, 4]
想要这样的结果应该怎么处理呢?
一、只有一层嵌套的数组
const arr = [0, 1, 2, [3, 4]];
[].concat(...arr); // [0,1,2,3,4]
使用concat方法和扩展运算符能够将一层嵌套的数组展开。
二、确定了层级数量的嵌套数组
let arr = [2,3, [10,11,12, [111,222,333,[4444]]]];
arr.flat(3); // [2, 3, 10, 11, 12, 111, 222, 333, 4444]
使用数组的flat(depth)方法,flat接受一个参数,为指定要提取嵌套数组的结构深度,默认值为 1。
三、不确定层级数量的嵌套数组
1、使用flat()
let arr = [2,3, [10,11,12, [111,222,333,[4444]]]];
arr.flat(Infinity); // [2, 3, 10, 11, 12, 111, 222, 333, 4444]
同样的例子,假设我们不知道arr的层级深度,可以使用关键字Infinity作为flat的参数,可以展开任意深度的嵌套数组。但IE浏览器不支持flat,有IE场景的朋友可以使用下面的方法。
2、使用 reduce、concat 和递归展开无限多层嵌套的数组
var arr = [1,2,3,[4,5,6, [7,8,9]]];
function flatDeep(arr, d = 1) {
return d > 0 ? arr.reduce((acc, val) => acc.concat(Array.isArray(val) ?
flatDeep(val, d - 1) : val), []) : arr.slice();
};
flatDeep(arr, Infinity); // [1,2,3,4,5,6,7,8,9]
延展阅读
flat除了可以用于数组的扁平化处理以外,还可以去除数组中的空元素,但对undefined和null是不会过滤的。
let arr = [1,2,,3,4];
let arr1 = [1,2,3,4,undefined,null];
arr.flat(); // [1,2,3,4]
arr1.flat(); // [1,2,3,4,undefined,null];