多维数组转一维数组
1,递归方法
var arr = [1, [2, 3], [3, 2, [1, 6, [3, 5, '3']],'你好',{a:1,b:2}]]
var newArr = []
function fun(array) {
var len = array.length
for (var i = 0; i < len; i++) {
// console.log(typeof array[i])
if (Array.isArray(array[i])) { // 如若数组元素类型是Array,则递归
fun(array[i])
} else {
newArr.push(array[i]) // 否则添加到newArr数组中
}
}
return newArr
}
console.log(fun(arr))
Array.isArray()方法传递一个参数,如果参数为数组则返回true,反之false
2,使用ES数组方法flat()
var arr = [1, [2, 3], [3, 2, [1, 6, [3, 5, '3']],'你好',{a:1,b:2}]]
var newArr = []
var newArr = arr.flat(Infinity)//Infinity表示展开到最底层,可以指定展开层数
var newArr2 = arr.flat(2)
console.log(newArr) // [1, 2, 3, 3, 2, 1, 6, 3, 5, "3", "你好", {…}]
console.log(newArr2) //[1, 2, 3, 3, 2, 1, 6, [3, 5, '3'], "你好", {…}]
不知道是不是兼容性问题,好像用这种方法的不太多。
3,使用reduce方法递归转为一维
var arr = [1, [2, 3], [3, 2, [1, 6, [3, 5, '3']], '你好', { a: 1, b: 2 }]]
var fun = (arr) => arr.reduce((prev, curr) => {
if (Array.isArray(curr)) {
return prev.concat(...fun(curr));
}
return prev.concat(curr);
}, []);
const newArr = fun(arr);
console.log(newArr);
reduce方法:
语法:
arr.reduce(callback,[valueInitial])
回调函数callback(prev,cur,index,arr),前面两个参数是必选,后面两个是可选
1,previousValue
:上一次调用回调返回的值
2,currentValue
:数组中当前被处理的元素
3,index
:当前元素在数组中的索引
4,array
:调用reduce方法的数组
参数二: 首次调用该函数时,作为callback的第一个参数使用,reduce详解及高级用法可参考这篇博客: https://www.jianshu.com/p/e375ba1cfc47
4,使用lodash里面的flattenDepth方法
安装lodash: npm install --save lodash
引入lodash到指定文件:import * as _ from ‘lodash’
语法:_.flattenDepth(array, [depth=1])
array (Array): 需要减少嵌套层级的数组。
[depth=1] (number):最多减少的嵌套层级数。
(Array): 返回减少嵌套层级后的新数组。
const arr = [1, 2,[3, 4, [5, "ad", ["cd",['12',32,['cc',13]], 5], 9]]];
const newArr = _.flattenDepth(arr,3) //最多减少3层嵌套层级数
const newArr2 = _.flattenDepth(arr,Infinity) //展开所有的嵌套
console.log(newArr) // [ 1, 2, 3, 4, 5, "ad", "cd", [ "12", 32, [ "cc", 13 ] ], 5, 9 ]
console.log(newArr2) // [ 1, 2, 3, 4, 5, "ad", "cd", "12", 32, "cc", 13, 5, 9 ]