js数组降维的实现

39 阅读1分钟

场景:vue2源码中,把数组打平,让它的深度只有一层

二维数组降为一维数组

export function simpleNormalizeChildren (children: any) {
  for (let i = 0; i < children.length; i++) {
    if (Array.isArray(children[i])) {
      return Array.prototype.concat.apply([], children)
    }
  }
  return children
}

分析: Array.prototype.concat.apply([], children)

  • concat: 如果concat方法的参数是一个元素,该元素会被直接插入到新数组中;如果参数是一个数组,该数组的各个元素将被插入到新数组中
  • apply: apply方法会调用一个函数,apply方法的第一个参数会作为被调用函数的this值,apply方法的第二个参数(一个数组,或类数组的对象)会作为被调用对象的arguments值,也就是说该数组的各个元素将会依次成为被调用函数的各个参数

多维数组降为一维数组

function simpleNormalizeChildren(children){
    let arr = [];
    for(let i=0;i<children.length;i++){
        if(Array.isArray(children[i])){
            arr = arr.concat(simpleNormalizeChildren(children[i]))
        }else{
            arr = arr.concat(children[i])
        }
    }
    return arr;
}