JavaScript Array 属性、方法 (一)
JavaScript Array 属性、方法 (二)
JavaScript Array 属性、方法 (三)
使用 reduce 与 concat
- 只有两级数组的扁平化
let arr = [1, 2, [3, 4]];
let result1 = arr.flat();
console.log(result1);
let result2 = arr.reduce((acc, val) => acc.concat(val), []);
console.log(result2);
const flattened = arr => [].concat(...arr);
let result3 = flattened(arr);
console.log(result3)
- 使用
reduce、concat 和递归无限反嵌套多层嵌套的数组
let arr1 = [1, 2, 3, [1, 2, 3, 4, [2, 3, 4]]];
const flattenDeep = arr1 => {
return arr1.reduce(
(acc, val) =>
Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val),
[]
);
};
let result = flattenDeep(arr1);
console.log(result)
- 不使用递归,使用
stack 无限反嵌套多层嵌套数组
let arr1 = [1, 2, 3, [1, 2, 3, 4, [2, 3, 4]]];
const flatten = input => {
const stack = [...input];
const res = [];
while (stack.length) {
const next = stack.pop();
if (Array.isArray(next)) {
stack.push(...next);
} else {
res.push(next);
}
}
return res.reverse();
};
let result = flatten(arr1);
console.log(result);
- 递归版本的反嵌套
let arr1 = [1, 2, 3, [1, 2, 3, 4, [2, 3, 4]]];
const flatten = array => {
let flattend = [];
(function flat(array) {
array.forEach(el => {
if (Array.isArray(el)) flat(el);
else flattend.push(el);
});
})(array);
return flattend;
};
let result = flatten(arr1);
console.log(result)
reduce + concat + isArray + recursivity
let arr1 = [1, 2, 3, [1, 2, 3, 4, [2, 3, 4]]];
let arr = [1, 2, [3, 4, [5, 6]]];
const flatDeep = arr => {
return arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatDeep(val) : val), []);
};
let result = flatDeep(arr1);
console.log(result)
使用堆栈(Use a stack)
let arr1 = [1, 2, 3, [1, 2, 3, 4, [2, 3, 4]]];
const flatten = input => {
const stack = [...input];
const res = [];
while (stack.length) {
const next = stack.pop();
if (Array.isArray(next)) {
stack.push(...next);
} else {
res.push(next);
}
}
return res.reverse();
};
let result = flatten(arr1);
console.log(result);
使用生成器函数(Use Generator function)
let arr1 = [1, 2, 3, [1, 2, 3, 4, [2, 3, 4]]];
function* flatten(array) {
for (const item of array) {
if (Array.isArray(item)) {
yield* flatten(item);
} else {
yield item;
}
}
}
const flattened = [...flatten(arr1)];
console.log(flattened);