[1,2,[3,[4,[5,[6,[7,[8,[9]]]]]]]]
遇到这种变态的多维数组结构也是头疼,需要自己展平整成一维数组;
es6 的flat 函数可以直接实现
原数组的成员里面有一个数组,flat()方法将子数组的成员取出来,添加在原来的位置。 flat 默认只会 // 拉平一层。
如果想要“拉平”多层的嵌套数组,可以将flat()方法的参数写成一个整数,表示想要拉平的层数,默认为1。
[1, 2, [3, 4]].flat()
// [1, 2, 3, 4]
// 原数组的成员里面有一个数组,flat()方法将子数组的成员取出来,添加在原来的位置。 flat 默认只会 // 拉平一层。
// 如果想要“拉平”多层的嵌套数组,可以将flat()方法的参数写成一个整数,表示想要拉平的层数,默认为1。
[1, 2, [3, [4, 5]]].flat()
// [1, 2, 3, [4, 5]]
[1, 2, [3, [4, 5]]].flat(2)
// [1, 2, 3, 4, 5]
flatMap()方法对原数组的每个成员执行一个函数,相当于执行Array.prototype.map(),然后对返回值组成的数组执行flat()方法。该方法返回一个新数组,不改变原数组。
// 相当于 [[2, 4], [3, 6], [4, 8]].flat()
[2, 3, 4].flatMap((x) => [x, x * 2])
// [2, 4, 3, 6, 4, 8]
注意 : flatMap()只能展开一层数组。
const flatten1 = arr => {
return arr.reduce((res, cur) => {
// 如果当前项cur为数组,就继续递归展平
if (Array.isArray(cur)) {
// 返回新数组包括展开的原数组元素和新展平的数组元素
return [...res, ...flatten1(cur)];
} else {
// 返回新数组包括展开的原数组元素和当前项
return [...res, cur];
}
}, []);
};
如果有需要设置一定的展平深度,可以输入参数来处理
const flatten2 = (arr, depth = 1, res = []) => {
let i = -1, len = arr.length;
while (++i < len) {
// 选择当前项来进行判断
let cur = arr[i];
// 如果depth大于0并且当前项cur是数组
if (depth > 0 && Array.isArray(cur)) {
// 并且depth深度大于1的时候,继续递归处理,深度-1
if (depth > 1) {
flatten2(cur, depth - 1, res);
} else {
res.push(cur);
}
} else {
// 当前项cur不是数组,就直接加到res的后面
res[res.length] = cur;
}
}
// 返回结果数组
return res;
};