1. 使用concat()
和递归
function flatten(arr) {
return arr.reduce((acc, val) => Array.isArray(val) ? acc.concat(flatten(val)) : acc.concat(val), []);
}
let multiDimArray = [[1, 2, [3]], 4];
let flatArray = flatten(multiDimArray);
console.log(flatArray); // 输出: [1, 2, 3, 4]
2. Array.prototype.flat()
ES2019引入了flat()
方法,可以直接展平数组。
let multiDimArray = [[1, 2, [3]], 4];
let flatArray = multiDimArray.flat(Infinity); // 深度展平
console.log(flatArray); // 输出: [1, 2, 3, 4]
3. Array.prototype.reduce()
和 concat()
let multiDimArray = [[1, 2], [3, 4]];
let flatArray = multiDimArray.reduce((acc, val) => acc.concat(val), []);
console.log(flatArray); // 输出: [1, 2, 3, 4]
4. 扩展运算符和递归
function flatten(arr) {
return arr.reduce((acc, val) => Array.isArray(val) ? [...acc, ...flatten(val)] : [...acc, val], []);
}
let multiDimArray = [[1, 2, [3]], 4];
let flatArray = flatten(multiDimArray);
console.log(flatArray); // 输出: [1, 2, 3, 4]
5. while
循环和push()
let multiDimArray = [[1, 2, [3]], 4];
let flatArray = [];
let stack = [...multiDimArray];
while (stack.length) {
let next = stack.pop();
if (Array.isArray(next)) {
stack.push(...next);
} else {
flatArray.push(next);
}
}
flatArray.reverse(); // 因为是反向添加的,所以需要反转
console.log(flatArray); // 输出: [1, 2, 3, 4]
6. Array.prototype.forEach()
和 push()
let multiDimArray = [[1, 2], [3, 4]];
let flatArray = [];
multiDimArray.forEach(subArr => subArr.forEach(item => flatArray.push(item)));
console.log(flatArray); // 输出: [1, 2, 3, 4]
7. for...of
循环和Array.isArray()
let multiDimArray = [[1, 2, [3]], 4];
let flatArray = [];
for (const subArr of multiDimArray) {
if (Array.isArray(subArr)) {
for (const item of subArr) {
flatArray.push(item);
}
} else {
flatArray.push(subArr);
}
}
console.log(flatArray); // 输出: [1, 2, 3, 4]
8. 使用Array.from()
和映射函数
let multiDimArray = [[1, 2], [3, 4]];
let flatArray = Array.from(multiDimArray, (...subArr) => subArr).flat();
console.log(flatArray); // 输出: [1, 2, 3, 4]
9. Generator
函数和展开运算符
function* flattenGenerator(arr) {
for (const item of arr) {
if (Array.isArray(item)) {
yield* flattenGenerator(item);
} else {
yield item;
}
}
}
let multiDimArray = [[1, 2, [3]], 4];
let flatArray = [...flattenGenerator(multiDimArray)];
console.log(flatArray); // 输出: [1, 2, 3, 4]
10. String.split()
和Number()
这种方法适用于数字数组,且不推荐用于复杂场景,因为会涉及类型转换,可能有精度损失。
let multiDimArray = [[1, 2], [3, 4]];
let flatArray = multiDimArray.join(',').split(',').map(Number);
console.log(flatArray); // 输出: [1, 2, 3, 4]