多维数组 => 一维数组

js
let ary = [1, [2, [3, [4, 5]]], 6]; // -> [1, 2, 3, 4, 5, 6]
let str = JSON.stringify(ary);<!-- more -->
es6 的 flat 方法
js
arr = arr.flat(Infinity);replace + split
js
arr = String(arr)
.replace(/(\[|\])/g, "")
.split(",");replace + JSON.parse
js
str = String(arr).replace(/(\[|\])/g, "");
str = "[" + str + "]";
str = JSON.parse(str);普通递归
js
let result = [];
let rec = (arr) => {
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
rec(arr[i]);
} else {
result.push(arr[i]);
}
}
};
rec(arr);js
var a = [1, [2, [3, 4, 5]]];
function flatten(arr) {
let result = [];
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
result = result.concat(flatten(arr[i]));
} else {
result.push(arr[i]);
}
}
return result;
}
flatten(a); // [1, 2, 3, 4,5]利用 reduce 函数迭代
concat 既可以接数组,又可以接对象
js
function flatten(ary) {
return ary.reduce((pre, cur) => {
return pre.concat(Array.isArray(cur) ? flatten(cur) : cur);
}, []);
}
let ary = [1, 2, [3, 4], [5, [6, 7]]];
console.log(flatten(ary));扩展运算符
我们先用数组的 some 方法把数组中仍然是数组的项过滤出来,然后执行 concat 操作,利用 ES6 的展开运算符,将其拼接到原数组中,最后返回原数组
js
//只要有一个元素有数组,那么循环继续
while (ary.some(Array.isArray)) {
ary = [].concat(...ary);
}