用if进行判断
var arr = [1, [2, 3], "4,5", [6,[7]]] //给数组arr赋值
function flat(arr){ //用函数实现拍平
var arr2 = [] //赋值一个新的空数组
arr.forEach(function(val){ //用 forEach 遍历数组arr
if (Array.isArray(val)){ //用 Array.isArray 判断数组内的每一项 "val" 是否为数组
arr2 = arr2.concat(flat(val)) //如果是数组,再执行一遍flat,递归。 .concat 产生新数组,需要重新赋值
}
else{
arr2.push(val) //否则直接将 "val" push到arr2的后面
}
})
return arr2 //返回arr2的值
}
var a = flat(arr)
console.log(a) //arr2 = [1, 2, 3, "4, 5", 6, 7]
使用reduce进行合并的方法
var arr = [1, [2, 3], "4,5", [6,[7]]]
function flat2(arr){ //用函数实现拍平
return arr.reduce( //返回一个值。值的内容是reduce合并后的内容,创建一个函数来表示reduce
function(v1, v2){ //意思分别为数组的前一项和后一项
return v1.concat(Array.isArray(v2)?flat2(v2):v2) //返回值。值的内容是:如果是一个数组,继续拍平,如果不是数组,直接concat到前一项的后面
} //第一次concat就是 [].concat(arr[0])
,[] //重要!!!这里定义的是reduce的初始值,一个空数组,此时前一项是[],后一项是arr[0]
)
}
var arr2 = flat2(arr)
console.log(arr2) //[1, 2, 3, "4,5", 6, 7]
上面的代码美化以后
var arr = [1, [2, 3], "4,5", [6,[7]]]
function flat2(arr){
return arr.reduce(function(v1, v2){
return v1.concat(Array.isArray(v2)?flat2(v2):v2)}
,[])
}
var arr2 = flat2(arr)
console.log(arr2) //[1, 2, 3, "4,5", 6, 7]