携手创作,共同成长!这是我参与「掘金日新计划 · 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内部方法的使用和实现。