原数组
const arr = [1, [2, 3, 4], [5, 6, [7, 8]], 9]
希望输出 [1, 2, 3, 4, 5, 6, 7, 8, 9]
// 方法一 递归
function arrDelayering (arr) {
arr.forEach(v => {
if (v instanceof Array) {
arrDelayering(v)
} else {
newArr.push(v)
}
})
return newArr
}
let newArr = []
arrDelayering(arr) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
MDN Array.prototype.concat() 描述
MDN Function.prototype.apply()描述
// 方法二 利用apply concat
// concat:如果concat方法的参数是一个元素,该元素会被直接插入到新数组中;
如果参数是一个数组,该数组的各个元素将被插入到新数组中
// apply:apply方法会调用一个函数,apply方法的第一个参数会作为被调用函数的this值,
apply方法的第二个参数(一个数组,或类数组的对象)会作为被调用对象的arguments值,
也就是说该数组的各个元素将会依次成为被调用函数的各个参数;
function arrDelayering2(arr) {
while(arr.some(a => Array.isArray(a))) {
// 方法二
// [].concat.apply([], arr) 括号中的[] 是指在 [].concat 函数运行时使用的 this 值
// 括号中的arr数组元素将作为单独的参数传给 [].concat 函数
// 返回值:调用有指定this值 即括号中的[] 和 参数的函数的结果 即括号中的arr数组元素
arr = [].concat.apply([], arr)
// 或者 arr = Array.prototype.concat.apply([], arr)
// 方法三 es6展开运算符
// arr = [].concat(...arr)
}
return arr
}
arrDelayering2(arr) // [1, 2, 3, 4, 5, 6, 7, 8, 9]