lodash里的nth和nthArg

83 阅读2分钟

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

前言

本篇章我们将了解lodash里的nth和nthArg两个对外导出的方法,通过了解各自方法的使用和实现,学习对于方法的封装和逻辑处理。

nth

nth方法主要是获取参数array数组的第n个元素。如果n为负数,则返回从数组结尾开始的第n个元素。

参数说明:

  • 参数1:数字类型,表示要查询的数组。
  • 参数2:数字类型,表示要返回元素的索引值,默认为0。

使用如下:

var array = ['a', 'b', 'c', 'd'];
 
_.nth(array, 1);
// => 'b'
 
_.nth(array, -2);
// => 'c';

nth方法在实现上会先对参数数组进行判断,只有参数数组array存在,并且参数数组array身上存在length的属性,调用核心方法baseNth,返回其结果,否则返回undefined。

所以即使array是数组但是长度为0,其结果也会返回undefined,字符串身上也存在length属性,所以该方法也适用于字符串。

源码如下:

import baseNth from './_baseNth.js';
import toInteger from './toInteger.js';

function nth(array, n) {
  return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;
}

baseNth

baseNth方法是_.nth方法的基本实现,主要是查找数组的指定项,该方法接受两个参数,第一个参数是源数组,第二个是数组指定项的下标。

实现上会先通过isIndex方法判断参数n是否在数组的下标范围。不在的话会返回undefined,在的话直接返回array[n]。

源码如下:

import isIndex from './_isIndex.js';

function baseNth(array, n) {
  var length = array.length;
  if (!length) {
    return;
  }
  n += n < 0 ? length : 0;
  return isIndex(n, length) ? array[n] : undefined;
}

toInteger

toInteger方法在《 lodash里to系列之如何将数据转换成数字类型 》中我们已经了解了其方法实现。

nthArg

nthArg方法主要是创建一个函数,这个函数返回第n 个参数。如果 n为负数,则返回从结尾开始的第n个参数。

该方法接收一个数字类型的参数,表示要返回参数的索引值,默认为0。

使用如下:

var func = _.nthArg(1);
func('a', 'b', 'c', 'd');
// => 'b'
 
var func = _.nthArg(-2);
func('a', 'b', 'c', 'd');
// => 'c'

方法实现上,会先调用toInteger方法对参数n进行初始化赋值为整数,然后调用baseRest返回其调用结果,其中baseRest传递的参数是返回baseNth方法的调用结果,baseNth方法是nth方法的核心实现。

源码如下:

import baseNth from './_baseNth.js';
import baseRest from './_baseRest.js';
import toInteger from './toInteger.js';

function nthArg(n) {
  n = toInteger(n);
  return baseRest(function(args) {
    return baseNth(args, n);
  });
}

baseRest

在《 lodash里的rest方法 》这一篇章中我们了解了baseRest内部方法的实现。

小结

本篇章我们通过lodash里的nth和nthArg两个方法的使用和实现,其中重点是baseNth核心方法的处理逻辑,同时我们也了解了baseRest内部方法的使用和实现。