在JavaScript中,扁平化数组是指将多维数组转换为一维数组的过程。例如,将[[1, 2], [3, [4, 5]]]
转换为[1, 2, 3, 4, 5]
。
function shallowFlatten(arr) {
return arr.reduce((acc, val) => acc.concat(val), []);
}
const nestedArray = [[1, 2], [3, 4]];
console.log(shallowFlatten(nestedArray)); // 输出: [1, 2, 3, 4]
function deepFlatten(arr) {
return arr.reduce((acc, val) => Array.isArray(val) ? acc.concat(deepFlatten(val)) : acc.concat(val), []);
}
const deeplyNestedArray = [[1, 2], [3, [4, [5, 6]]]];
console.log(deepFlatten(deeplyNestedArray)); // 输出: [1, 2, 3, 4, 5, 6]
原因:对于非常大的数组或非常深的嵌套结构,递归方法可能会导致栈溢出或性能下降。
解决方法:可以使用迭代方法来避免递归带来的问题。
function deepFlattenIterative(arr) {
const result = [];
const stack = [...arr];
while (stack.length) {
const next = stack.pop();
if (Array.isArray(next)) {
stack.push(...next);
} else {
result.push(next);
}
}
return result.reverse();
}
原因:数组中可能包含null
、undefined
或其他非数组值,这些值在处理时可能会引发错误。
解决方法:在进行扁平化操作前,可以对数组元素进行类型检查。
function safeDeepFlatten(arr) {
return arr.reduce((acc, val) => {
if (Array.isArray(val)) {
acc.push(...safeDeepFlatten(val));
} else if (val !== null && val !== undefined) {
acc.push(val);
}
return acc;
}, []);
}
通过这些方法和注意事项,可以有效地处理JavaScript中的数组扁平化问题。