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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容