lodash-array-compact函数实现

前言

今天讲的是compact()/concat()函数。

compact()

创建一个新数组,包含原数组中所有的非假值元素。例如false, null, 0, "", undefined, 和 NaN 都是被认为是“假值”。

我的实现是

function compact(array){
    if(!array || !Array.isArray(array) || array.length<=0){
        return [];
    }

    return array.filter(function (value){
        if(value) return value;
    });

}

我只是调用了es6语法中Array的filter实例方法,实现起来比较简单

lodash的实现是:

function compact(array) {
  var index = -1,
      length = array == null ? 0 : array.length,
      resIndex = 0,
      result = [];

  while (++index < length) {
    var value = array[index];
    if (value) {
      result[resIndex++] = value;
    }
  }
  return result;
}

它是遍历整个数组,如果元素非假,就加入到result数组,最后返回result

concat()

创建一个新数组,将array与任何数组 或 值连接在一起。

我的实现是

function concat(array){
    if(!array || !Array.isArray(array)|| array.length<=0){
        return [];
    }
    if(arguments.length<=1){
        return array.concat();
    }else{
        var args=Array.from(arguments);
        var arg= args.splice(1,1);
        args[0]=array.concat(arg);
        return concat.apply(this,args);
    }
}

我是用递归方法,每次通过arguments得到一个要连接的参数arg并移除,然后调用array.concat(arg)生成新的array,通过concat.apply()递归调用,直到没有要连接的参数为止。

lodash的实现是:

function concat() {
  var length = arguments.length;
  if (!length) {
    return [];
  }
  var args = Array(length - 1),
      array = arguments[0],
      index = length;

  while (index--) {
    args[index - 1] = arguments[index];
  }
  return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
}

function arrayPush(array, values) {
  var index = -1,
      length = values.length,
      offset = array.length;

  while (++index < length) {
    array[offset + index] = values[index];
  }
  return array;
}

它没有用递归,主要逻辑在最后,先拷贝一份array,调用arrayPush()函数,arrayPush()函数的作用用一个循环,就往array上一个一个追加values

你可能感兴趣的:(lodash-array-compact函数实现)