以下是八种数组扁平化方法的使用场景和优缺点:
根据具体的需求和代码环境,选择适合的方法来实现数组扁平化。考虑性能、代码复杂度和可读性等因素,选择最适合的方法进行实现。
以下是实现数组扁平化的8种方式:
function flatten(arr) {
let result = [];
arr.forEach(item => {
if (Array.isArray(item)) {
result = result.concat(flatten(item));
} else {
result.push(item);
}
});
return result;
}
function flatten(arr) {
return arr.reduce((result, item) => {
if (Array.isArray(item)) {
result = result.concat(flatten(item));
} else {
result.push(item);
}
return result;
}, []);
}
function flatten(arr) {
while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}
function flatten(arr) {
return arr.flat(Infinity);
}
function flatten(arr) {
return arr.toString().split(',').map(item => +item);
}
function flatten(arr) {
return JSON.parse('[' + JSON.stringify(arr).replace(/\[|\]/g, '') + ']');
}
function flatten(arr) {
const stack = [...arr];
const result = [];
while (stack.length) {
const next = stack.pop();
if (Array.isArray(next)) {
stack.push(...next);
} else {
result.unshift(next);
}
}
return result;
}
function flatten(arr) {
return [].concat(...arr.map(item => Array.isArray(item) ? flatten(item) : item));
}
这些方法都可以将多层嵌套的数组扁平化为一维数组。具体使用哪种方法取决于你的需求和代码环境。
以下是将八种方法封装为各自的函数,并进行调用的示例:
// 1. 使用递归
function flattenByRecursion(arr) {
let result = [];
function flattenHelper(arr) {
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
flattenHelper(arr[i]);
} else {
result.push(arr[i]);
}
}
}
flattenHelper(arr);
return result;
}
// 2. 使用 reduce 方法
function flattenByReduce(arr) {
return arr.reduce((acc, cur) => {
return Array.isArray(cur) ? acc.concat(flattenByReduce(cur)) : acc.concat(cur);
}, []);
}
// 3. 使用扩展运算符
function flattenBySpreadOperator(arr) {
while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}
// 4. 使用 flat 方法(ES2019)
function flattenByFlat(arr) {
return arr.flat(Infinity);
}
// 5. 使用 toString 和 split 方法
function flattenByToString(arr) {
return arr.toString().split(",").map(item => +item);
}
// 6. 使用正则表达式和 JSON 方法
function flattenByRegexAndJSON(arr) {
return JSON.parse("[" + JSON.stringify(arr).replace(/\[|\]/g, "") + "]");
}
// 7. 使用堆栈
function flattenByStack(arr) {
let result = [];
let stack = [...arr];
while (stack.length) {
let next = stack.pop();
if (Array.isArray(next)) {
stack.push(...next);
} else {
result.unshift(next);
}
}
return result;
}
// 8. 使用扩展运算符和递归
function flattenBySpreadOperatorAndRecursion(arr) {
return arr.reduce((acc, cur) => {
return Array.isArray(cur) ? [...acc, ...flattenBySpreadOperatorAndRecursion(cur)] : [...acc, cur];
}, []);
}
// 调用示例
let nestedArray = [1, [2, [3, 4], 5], 6, [7]];
console.log(flattenByRecursion(nestedArray));
console.log(flattenByReduce(nestedArray));
console.log(flattenBySpreadOperator(nestedArray));
console.log(flattenByFlat(nestedArray));
console.log(flattenByToString(nestedArray));
console.log(flattenByRegexAndJSON(nestedArray));
console.log(flattenByStack(nestedArray));
console.log(flattenBySpreadOperatorAndRecursion(nestedArray));
你可以根据需要选择其中的某个方法进行调用,或者根据具体的需求进行修改和优化。