Array有map()和filter()方法,可是Object没有这些方法。此外,低版本的浏览器例如IE6~8也没有这些方法,怎么办?正如jQuery统一了不同浏览器之间的DOM操作的差异,让我们可以简单地对DOM进行操作,underscore则提供了一套完善的函数式编程的接口,让我们更方便地在JavaScript中实现函数式编程。jQuery在加载时,会把自身绑定到唯一的全局变量$上,underscore与其类似,会把自身绑定到唯一的全局变量_上。

Collections

  • map/filter

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var obj = {
    name: 'bob',
    school: 'No.1 middle school',
    address: 'xueyuan road'
    };
    //返回数组
    var upper = _.map(obj, function (value,key) {
    return key+'='+value;
    });
    //返回对象
    var upper = _.mapObject(obj, function (value,key) {
    return key+'='+value;
    });
  • every/some

    1
    2
    3
    4
    // 所有元素都大于0?
    _.every([1, 4, 7, -3, -9], (x) => x > 0); // false
    // 至少一个元素大于0?
    _.some([1, 4, 7, -3, -9], (x) => x > 0); // true
  • max/min

    • 这两个函数直接返回集合中最大和最小的数

      1
      2
      3
      4
      5
      6
      7
      8
      9
      var arr = [3, 5, 7, 9];
      _.max(arr); // 9
      _.min(arr); // 3
      // 空集合会返回-Infinity和Infinity,所以要先判断集合不为空:
      _.max([])
      -Infinity
      _.min([])
      Infinity
    • 如果集合是Object,max()和min()只作用于value,忽略掉key

      1
      _.max({ a: 1, b: 2, c: 3 }); // 3

groupBy

集合的元素按照key归类,key由传入的函数返回

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var scores = [20, 81, 75, 40, 91, 59, 77, 66, 72, 88, 99];
var groups = _.groupBy(scores, function (x) {
if (x < 60) {
return 'C';
} else if (x < 80) {
return 'B';
} else {
return 'A';
}
});
// 结果:
// {
// A: [81, 91, 88, 99],
// B: [75, 77, 66, 72],
// C: [20, 40, 59]
// }

shuffle/sample

  • shuffle()用洗牌算法随机打乱一个集合

    1
    2
    // 注意每次结果都不一样:
    _.shuffle([1, 2, 3, 4, 5, 6]); // [3, 5, 4, 6, 2, 1]
  • sample()则是随机选择一个或多个元素

    1
    2
    3
    4
    5
    // 注意每次结果都不一样:
    // 随机选1个:
    _.sample([1, 2, 3, 4, 5, 6]); // 2
    // 随机选3个:
    _.sample([1, 2, 3, 4, 5, 6], 3); // [6, 1, 4]