拾遗

_.compact

_.compact(array):去除 array 中所有 “否定” 项目。

在 JavaScript 中,这些值被认为具有 “否定” 意向:

  • false
  • null
  • 0
  • ""
  • undefined
  • NaN

怎么验证呢?

Boolean(false); // => false
Boolean(null); // => false
Boolean(0); // => false
Boolean(""); // => false
Boolean(undefined); // => false
Boolean(NaN); // => false

源码

_.compact = function (array) {
    return _.filter(array, Boolean);
};

用例

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

_.object

_.object(list, values):将 list 转换为对象

源码

_.object = function (list, values) {
    var result = {};
    for (var i = 0, length = getLength(list); i < length; i++) {
        if (values) {
            result[list[i]] = values[i];
        } else {
            result[list[i][0]] = list[i][1];
        }
    }
    return result;
};

看到源码,根据传入参数的形式不同,有两种策略将数组转化为对象:

  • 若没有传入值序列 values,则视 list 中每个元素为一个 k-v 对:
var list = [['moe',30], ['larry', 40], ['curly', 50]];
  • 如果传入了 values,则视 list 为 key 集合
var list = ['moe','larry','curly'];
var values = [30, 40, 50];

用例

_.object(['moe', 'larry', 'curly'], [30, 40, 50]);
// => {moe: 30, larry: 40, curly: 50}
_.object([['moe', 30], ['larry', 40], ['curly', 50]]);
// => {moe: 30, larry: 40, curly: 50}

_.range

_.range(start, stop, step):设置步长 step,产生一个 [start, n) 的序列。

如果有过 python 开发经验,那对区间产生函数一定不会陌生,该函数对于我们快速产生一个落在区间范围内的数组大有裨益,python 中,区间函数为 range

## 产生 [n,m) 内的数组
range(1, 11);
## => [1,2,3,4,5,6,7,8,9,10]

## 指定步长
range(1,11,2)
## => [1,3,5,7,9]

## 从 [0, n)
range(5)
## => [1,2,3,4]

underscore 也提供了一个用法类似的区间函数 _.range

_.range = function (start, stop, step) {
    // 校正终点
    if (stop == null) {
        stop = start || 0;
        start = 0;
    }
    // 校正步长
    if (!step) {
        step = stop < start ? -1 : 1;
    }

    // 计算最终数组的长度
    var length = Math.max(Math.ceil((stop - start) / step), 0);
    var range = Array(length);

    for (var idx = 0; idx < length; idx++, start += step) {
        range[idx] = start;
    }

    return range;
};

其接受 3 个参数:

  • start:起点,如果只提供了该参数,那么起点被认为是 0,终点为 start
  • stop: 终点
  • step: 步长,如果未提供该参数,则需要根据 start<stop 来判定行进方向,正向 1,负向 -1

用例

_.range(10);
// => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

_.range(1, 11);
// => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

_.range(0, 30, 5);
// => [0, 5, 10, 15, 20, 25]

_.range(0, -10, -1);
// => [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

_.range(0);
// => []

_.chunk

_.chunk(array, count):将 array 划分为若干份,每份 count 个元素,再合并到一个数组

源码

_.chunk = function (array, count) {
    if (count == null || count < 1) return [];

    var result = [];
    var i = 0, length = array.length;
    while (i < length) {
        result.push(slice.call(array, i, i += count));
    }
    return result;
};

用例

_.chunk([1,2,3,4,5,6,7], 2);
// => [[1,2], [3,4], [5,6], [7]]

results matching ""

    No results matching ""