underscore中和数组相关的方法基本差不多了,就剩下几个小方法了。

first initial last rest

这几个方法是用来获取数组的子集的。前两个方法是获取头几个元素,后两个方法是获取后几个元素。

_.first = _.head = _.take = function(array, n, guard) {
    if (array == null) return void 0;
    // 没有指定获取几个,返回第一个元素
    if (n == null || guard) return array[0];
    // 返回头n个元素
    return _.initial(array, array.length - n);
};

_.initial = function(array, n, guard) {
    // 利用slice方法获取头n个元素
    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
};


_.last = function(array, n, guard) {
    if (array == null) return void 0;
    // 没指定获取几个,返回最后一个元素
    if (n == null || guard) return array[array.length - 1];
    // 获取后n个元素
    return _.rest(array, Math.max(0, array.length - n));
};

// 与initial方法类似,获取从n开始的元素
_.rest = _.tail = _.drop = function(array, n, guard) {
    return slice.call(array, n == null || guard ? 1 : n);
};

object

这个方法如果只传入第一个参数,可以理解为是Object.entries的逆方法。如果传入第二个数组,会将两个数组合并为一个对象,第一个数组的元素做key,第二个数组的元素做value。

_.object = function(list, values) {
    var result = {};
    for (var i = 0, length = getLength(list); i < length; i++) {
        //将两个数组合并为一个对象
        if (values) {
            result[list[i]] = values[i];
        } else {
        // Object.entries方法的逆方法
            result[list[i][0]] = list[i][1];
        }
    }
    return result;
};

results matching ""

    No results matching ""