underscore源码解析(四)集合(Collections)
2023-09-28 10:58:40
导语
在上一篇文章中,我们介绍了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, '