将多维数组扁平化,如:
let arr = [1, 2, [3, 4, 5, [6, 7], 8], 9, 10, [11, [12, 13]]];
// 扁平化后
arr = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ];
-
数组转换成字符串再转回数组
let arr = [1, 2, [3, 4, 5, [6, 7], 8], 9, 10, [11, [12, 13]]]; arr = arr.join(',').split(',').map(Number); -
es6的some方法检测,然后用...扩展运算符来扁平化let arr = [1, 2, [3, 4, 5, [6, 7], 8], 9, 10, [11, [12, 13]]]; while(arr.some(item => Array.isArray(item))) { arr = [].concat(...arr); } -
es2019的flat方法let arr = [1, 2, [3, 4, 5, [6, 7], 8], 9, 10, [11, [12, 13]]]; arr = arr.flat(Infinity); -
递归方式
let arr = [1, 2, [3, 4, 5, [6, 7], 8], 9, 10, [11, [12, 13]]]; function flatten(arr) { let res = []; for (let i = 0, len = arr.length; i < len; i++) { if (Array.isArray(arr[i])) { res.push(...flatten(arr[i])); } else { res.push(arr[i]); } } return res; } flatten(arr); // 函数式编程,concat返回的是一个数组,所以用concat来合并成新数组 // 初始值为空数组,所以acc类型是数组 const flatten1 = x => x.reduce((acc, cur) => Array.isArray(cur) ? acc.concat(flatten1(cur)) : acc.concat(cur), []) -
队列方式
let arr = [1, 2, [3, 4, 5, [6, 7], 8], 9, 10, [11, [12, 13]]]; function flatten(arr) { const newArr = [...arr]; const res = []; while (newArr.length) { const item = newArr.shift(); // 出队 if (Array.isArray(item)) { newArr.unshift(...item); // 入队 } else { res.push(item); } } return res; } flatten(arr); -
利用
reduce和...let arr = [1, 2, [3, 4, 5, [6, 7], 8], 9, 10, [11, [12, 13]]]; const flatten = x => x.reduce((acc, cur) => Array.isArray(cur) ? acc.concat(...cur) : acc.concat(cur), []); flatten(arr);