flat方法
var arr1 = [1, 2, [3, 4]];
arr1.flat();
var arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();
var arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2);
var arr4 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]];
arr4.flat(Infinity);
var arr4 = [1, 2, , 4, 5];
arr4.flat();
使用 reduce 与 concat
var arr = [1, 2, [3, 4]];
arr.flat();
arr.reduce((acc, val) => acc.concat(val), []);
const flattened = arr => [].concat(...arr);
reduce + concat + isArray + recursivity
var arr1 = [1,2,3,[1,2,3,4, [2,3,4]]];
function flatDeep(arr, d = 1) {
return d > 0 ? arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatDeep(val, d - 1) : val), [])
: arr.slice();
};
flatDeep(arr1, Infinity);
forEach+isArray+push+recursivity
const eachFlat = (arr = [], depth = 1) => {
const result = [];
(function flat(arr, depth) {
arr.forEach((item) => {
if (Array.isArray(item) && depth > 0) {
flat(item, depth - 1)
} else {
result.push(item)
}
})
})(arr, depth)
return result;
}
const forFlat = (arr = [], depth = 1) => {
const result = [];
(function flat(arr, depth) {
for (let item of arr) {
if (Array.isArray(item) && depth > 0) {
flat(item, depth - 1)
} else {
item !== void 0 && result.push(item);
}
}
})(arr, depth)
return result;
}
使用堆栈stack
var arr1 = [1,2,3,[1,2,3,4, [2,3,4]]];
function 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();
}
flatten(arr1);
function flatten(array) {
var flattend = [];
(function flat(array) {
array.forEach(function(el) {
if (Array.isArray(el)) flat(el);
else flattend.push(el);
});
})(array);
return flattend;
}
Generator function
function* flatten(array) {
for (const item of array) {
if (Array.isArray(item)) {
yield* flatten(item);
} else {
yield item;
}
}
}
var arr = [1, 2, [3, 4, [5, 6]]];
const flattened = [...flatten(arr)];