返回

underscore源码解析(四)集合(Collections)

前端

导语

在上一篇文章中,我们介绍了underscore中的函数(Functions)相关的方法。在本文中,我们将介绍underscore中的集合(Collections)相关的方法。这些方法主要包括:

  • each
  • map
  • reduce
  • reduceRight
  • find
  • filter
  • where
  • findWhere
  • reject
  • every
  • some
  • contains
  • invoke
  • pluck
  • max
  • min
  • sortBy
  • groupBy
  • countBy
  • shuffle
  • sample

这些方法都可以用来处理数组和对象,并且它们都非常有用。在本文中,我们将逐一介绍这些方法的使用方法和注意事项。

each

each方法用于遍历数组或对象中的每个元素,并对每个元素执行指定的回调函数。回调函数可以接受三个参数:

  • 当前元素
  • 当前元素的索引
  • 数组或对象本身

each方法的语法如下:

_.each(collection, callback, [context])

例如,以下代码使用each方法遍历数组中的每个元素,并在每个元素上执行一个简单的操作:

var numbers = [1, 2, 3, 4, 5];

_.each(numbers, function(number) {
  console.log(number);
});

输出结果为:

1
2
3
4
5

map

map方法用于将数组或对象中的每个元素映射到一个新值。映射函数可以接受三个参数:

  • 当前元素
  • 当前元素的索引
  • 数组或对象本身

map方法的语法如下:

_.map(collection, mapper, [context])

例如,以下代码使用map方法将数组中的每个元素映射到一个新值:

var numbers = [1, 2, 3, 4, 5];

var doubledNumbers = _.map(numbers, function(number) {
  return number * 2;
});

输出结果为:

[2, 4, 6, 8, 10]

reduce

reduce方法用于将数组或对象中的所有元素归并为一个单一的值。归并函数可以接受四个参数:

  • 上一次归并的结果
  • 当前元素
  • 当前元素的索引
  • 数组或对象本身

reduce方法的语法如下:

_.reduce(collection, reducer, [initial], [context])

例如,以下代码使用reduce方法将数组中的所有元素求和:

var numbers = [1, 2, 3, 4, 5];

var sum = _.reduce(numbers, function(memo, number) {
  return memo + number;
});

输出结果为:

15

reduceRight

reduceRight方法与reduce方法类似,但它从数组或对象的末尾开始归并。reduceRight方法的语法如下:

_.reduceRight(collection, reducer, [initial], [context])

例如,以下代码使用reduceRight方法将数组中的所有元素求和:

var numbers = [1, 2, 3, 4, 5];

var sum = _.reduceRight(numbers, function(memo, number) {
  return memo + number;
});

输出结果为:

15

find

find方法用于在数组或对象中查找第一个满足指定条件的元素。条件函数可以接受三个参数:

  • 当前元素
  • 当前元素的索引
  • 数组或对象本身

find方法的语法如下:

_.find(collection, predicate, [context])

例如,以下代码使用find方法在数组中查找第一个大于3的元素:

var numbers = [1, 2, 3, 4, 5];

var firstNumberGreaterThan3 = _.find(numbers, function(number) {
  return number > 3;
});

输出结果为:

4

filter

filter方法用于在数组或对象中查找所有满足指定条件的元素。条件函数可以接受三个参数:

  • 当前元素
  • 当前元素的索引
  • 数组或对象本身

filter方法的语法如下:

_.filter(collection, predicate, [context])

例如,以下代码使用filter方法在数组中查找所有大于3的元素:

var numbers = [1, 2, 3, 4, 5];

var numbersGreaterThan3 = _.filter(numbers, function(number) {
  return number > 3;
});

输出结果为:

[4, 5]

where

where方法与filter方法类似,但它只适用于对象。where方法的语法如下:

_.where(collection, properties)

例如,以下代码使用where方法在数组中查找所有具有指定属性的对象:

var objects = [{name: 'John', age: 30}, {name: 'Mary', age: 25}];

var peopleNamedJohn = _.where(objects, {name: 'John'});

输出结果为:

[{name: 'John', age: 30}]

findWhere

findWhere方法与where方法类似,但它只返回第一个满足指定条件的对象。findWhere方法的语法如下:

_.findWhere(collection, properties)

例如,以下代码使用findWhere方法在数组中查找第一个具有指定属性的对象:

var objects = [{name: 'John', age: 30}, {name: 'Mary', age: 25}];

var personNamedJohn = _.findWhere(objects, {name: 'John'});

输出结果为:

{name: 'John', age: 30}

reject

reject方法与filter方法相反,它返回所有不满足指定条件的元素。条件函数可以接受三个参数:

  • 当前元素
  • 当前元素的索引
  • 数组或对象本身

reject方法的语法如下:

_.reject(collection, predicate, [context])

例如,以下代码使用reject方法在数组中查找所有小于3的元素:

var numbers = [1, 2, 3, 4, 5];

var numbersLessThan3 = _.reject(numbers, function(number) {
  return number < 3;
});

输出结果为:

[3, 4, 5]

every

every方法用于检查数组或对象中的所有元素是否都满足指定条件。条件函数可以接受三个参数:

  • 当前元素
  • 当前元素的索引
  • 数组或对象本身

every方法的语法如下:

_.every(collection, predicate, [context])

例如,以下代码使用every方法检查数组中的所有元素是否都大于3:

var numbers = [1, 2, 3, 4, 5];

var allNumbersGreaterThan3 = _.every(numbers, function(number) {
  return number > 3;
});

输出结果为:

false

some

some方法与every方法相反,它检查数组或对象中是否存在至少一个元素满足指定条件。条件函数可以接受三个参数:

  • 当前元素
  • 当前元素的索引
  • 数组或对象本身

some方法的语法如下:

_.some(collection, predicate, [context])

例如,以下代码使用some方法检查数组中是否存在至少一个元素大于3:

var numbers = [1, 2, 3, 4, 5];

var atLeastOneNumberGreaterThan3 = _.some(numbers, function(number) {
  return number > 3;
});

输出结果为:

true

contains

contains方法用于检查数组或对象中是否存在指定元素。元素可以是任何类型。contains方法的语法如下:

_.contains(collection, value)

例如,以下代码使用contains方法检查数组中是否存在元素3:

var numbers = [1, 2, 3, 4, 5];

var contains3 = _.contains(numbers, 3);

输出结果为:

true

invoke

invoke方法用于对数组或对象中的每个元素执行指定的方法。方法可以是任何函数,也可以是字符串。如果方法是字符串,那么它将被解析为数组或对象中元素的属性。invoke方法的语法如下:

_.invoke(collection, methodName, [arguments])

例如,以下代码使用invoke方法对数组中的每个元素执行toUpperCase方法:

var strings = ['a', 'b', 'c'];

var upperCasedStrings = _.invoke(strings, '