JavaScript Array 屬性、方法 (一)javascript
JavaScript Array 屬性、方法 (二)java
reduce
與 concat
let arr = [1, 2, [3, 4]];
let result1 = arr.flat();
console.log(result1);
// output[Array]: [1, 2, 3, 4]
let result2 = arr.reduce((acc, val) => acc.concat(val), []);
console.log(result2);
// output[Array]: [1, 2, 3, 4]
const flattened = arr => [].concat(...arr);
let result3 = flattened(arr);
console.log(result3)
// output[Array]: [1, 2, 3, 4]
複製代碼
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)
// output[Array]: [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
複製代碼
stack
無限反嵌套多層嵌套數組let arr1 = [1, 2, 3, [1, 2, 3, 4, [2, 3, 4]]];
const flatten = input => {
const stack = [...input];
const res = [];
while (stack.length) {
// 使用 pop 從 stack 中取出並移除值
const next = stack.pop();
if (Array.isArray(next)) {
// 使用 push 送回內層數組中的元素,不會改動原始輸入 original input
stack.push(...next);
} else {
res.push(next);
}
}
// 使用 reverse 恢復原數組的順序
return res.reverse();
};
let result = flatten(arr1);
console.log(result);
// output[Array]: [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
複製代碼
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)
// output[Array]: [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
複製代碼
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)
// output[Array]: [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
複製代碼
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);
}
}
// 使用 reverse 恢復原數組的順序
return res.reverse();
};
let result = flatten(arr1);
console.log(result);
// output[Array]: [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
複製代碼
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);
// output[Array]: [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
複製代碼