lodash里的compact和initial

193 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第34天,点击查看活动详情

前言

本篇章我们将了解lodash里的两个对外导出的方法compact和initial,在了解其使用的过程中,我们将了解其源码实现,其中initial的实现中借助的baseSlice方法,是后续封装slice操作相关的核心方法。

接下来我们先来了解各个方法的使用和实现。

compact

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

该方法接收一个数组类型的参数,返回新的过滤值数组。

使用如下:

_.compact([0, 1, false, 2, '', 3]);
// => [1, 2, 3]

compact方法实现上通过while进行遍历,在遍历的过程中对数组项进行检查,只有当数组项存在时才添加到容器数组,在遍历结束后返回容器数组。

源码如下:

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;
}

initial

initial方法主要是获取数组array中除了最后一个元素之外的所有元素,即去除数组array中的最后一个元素。

该方法接收一个数字类型的参数,表示要查询的数组,同时返回结果是参数array的切片。

使用如下:

_.initial([1, 2, 3]);
// => [1, 2]

在实现上,initial方法借助核心的切割方法baseSlice,当数组为null或者长度为0,又或者length属性不存在时,返回空数组,否则返回baseSlice的调用结果。

源码如下:

import baseSlice from './_baseSlice.js';

function initial(array) {
  var length = array == null ? 0 : array.length;
  return length ? baseSlice(array, 0, -1) : [];
}

baseSlice

baseSlice主要是执行数组的切割操作,该方法接收三个参数,代表原数组、起点、重点。结果会返回参数array的切片。

实现上会先对参数进行初始化判断与赋值。然后通过遍历起点到终点这个片段对容器数组进行赋值最终返回容器数组,即数组的切片结果。

源码如下:

function baseSlice(array, start, end) {
  var index = -1,
      length = array.length;

  if (start < 0) {
    start = -start > length ? 0 : (length + start);
  }
  end = end > length ? length : end;
  if (end < 0) {
    end += length;
  }
  length = start > end ? 0 : ((end - start) >>> 0);
  start >>>= 0;

  var result = Array(length);
  while (++index < length) {
    result[index] = array[index + start];
  }
  return result;
}

小结

本篇章我们了解了compact和initial两个方法,同时也了解了initial方法的核心baseSlice方法,同时我们也了解到lodash在遍历过程中习惯用while遍历,并且是在不改变原数组的情况下返回新的结果。