作者:Yeaseon
上篇文章,我們已經把關于Array部分的API學習了一遍,現在我們來開始下一篇Collection器联。
下列API的collection
參數指代Array | Object
兩種類型。
_.countBy
_.countBy(collection, [iteratee=_.identity])
創(chuàng)建一個key-value
的對象,key
是通過將collection
按照iteratee
規(guī)則迭代得到的愈污,對應的value
則是,這個key
值出現了N次轮傍,value
就是N暂雹。也就是迎合了API的count的意思。
例子:
_.countBy([6.1, 4.2, 6.3], Math.floor);
// => { '4': 1, '6': 2 }
// The `_.property` iteratee shorthand.
_.countBy(['one', 'two', 'three'], 'length');
// => { '3': 2, '5': 1 }
解釋第一個例子吧创夜,[6.1, 4.2, 6.3]
分別執(zhí)行Math.floor
得到[6, 4, 6]
,其中4
出現1次杭跪,6
出現2次,所以結果是{ '4': 1, '6': 2 }
。
_.every
_.every(collection, [predicate=_.identity])
如果collection
全部元素滿足predicate
條件驰吓,返回true
涧尿;否則只要出現不滿足的,就返回false
檬贰。predicate
調用三個參數value, index, array
姑廉。
例子:
_.every([true, 1, null, 'yes'], Boolean);
// => false
var users = [
{ 'user': 'barney', 'age': 36, 'active': false },
{ 'user': 'fred', 'age': 40, 'active': false }
];
// The `_.matches` iteratee shorthand.
_.every(users, { 'user': 'barney', 'active': false });
// => false
// The `_.matchesProperty` iteratee shorthand.
_.every(users, ['active', false]);
// => true
// The `_.property` iteratee shorthand.
_.every(users, 'active');
// => false
_.filter
_.filter(collection, [predicate=_.identity])
遍歷collection
全部元素,返回滿足predicate
條件的元素組成的新數組偎蘸。predicate
調用三個參數value, index, array
庄蹋。
例子:
var users = [
{ 'user': 'barney', 'age': 36, 'active': true },
{ 'user': 'fred', 'age': 40, 'active': false }
];
_.filter(users, function(o) { return !o.active; });
// => objects for ['fred']
// The `_.matches` iteratee shorthand.
_.filter(users, { 'age': 36, 'active': true });
// => objects for ['barney']
// The `_.matchesProperty` iteratee shorthand.
_.filter(users, ['active', false]);
// => objects for ['fred']
// The `_.property` iteratee shorthand.
_.filter(users, 'active');
// => objects for ['barney']
_.find
_.find(collection, [predicate=_.identity], [fromIndex=0])
與上面_.filter
不同的是_.find
只返回第一個匹配的元素瞬内,可以通過fromIndex
指定查找位置,默認fromIndex=0
限书。如果沒有匹配的虫蝶,返回undefined
。
例子:
var users = [
{ 'user': 'barney', 'age': 36, 'active': true },
{ 'user': 'fred', 'age': 40, 'active': false },
{ 'user': 'pebbles', 'age': 1, 'active': true }
];
_.find(users, function(o) { return o.age < 40; });
// => object for 'barney'
// The `_.matches` iteratee shorthand.
_.find(users, { 'age': 1, 'active': true });
// => object for 'pebbles'
// The `_.matchesProperty` iteratee shorthand.
_.find(users, ['active', false]);
// => object for 'fred'
// The `_.property` iteratee shorthand.
_.find(users, 'active');
// => object for 'barney'
_.findLast
_findLast(collection, [predicate=_.identity], [fromIndex=collection.length-1])
_.findLast
與_find
方法不同的是從右到左查找倦西,fromIndex
默認值collection.length-1
能真。
例子:
_.findLast([1, 2, 3, 4], function(n) {
return n % 2 == 1;
});
// => 3
_flatMap
_.flatMap(collection, [iteratee=_.identity])
collection
全部元素迭代執(zhí)行iteratee
,將得到的元素組合成一個flattened數組(我理解的就是變成N-1維數組)扰柠,iteratee
調用三個參數value, index|key, collection
粉铐。
例子:
function duplicate(n) {
return [n, n];
}
_.flatMap([1, 2], duplicate);
// => [1, 1, 2, 2]
解釋一下,[1, 2]
調用duplicate
得到[[1, 1], [2, 2]]
卤档,通過_.flatMap
使其扁平化[1, 1, 2, 2]
蝙泼。
_.flatMapDeep
_.flatMapDeep(collection, [iteratee=_.identity])
這個方法是_.flatMap
的升級版,會把多維數組變成一維數組劝枣。
例子:
function duplicate(n) {
return [[[n, n]]];
}
_.flatMapDeep([1, 2], duplicate);
// => [1, 1, 2, 2]
_.flatMapDepth
_.flatMapDepth(collection, [iteratee=_.identity], [depth=1])
這個是可以指定降維次數_.flatMapDeep
的版本汤踏。depth
降維次數默認為1。
例子:
function duplicate(n) {
return [[[n, n]]];
}
_.flatMapDepth([1, 2], duplicate, 2);
// => [[1, 1], [2, 2]]
_.forEach
_.forEach(collection, [iteratee=_.identity])
對collection
每個元素執(zhí)行iteratee
方法舔腾,iteratee
可以調用三個參數value, index|key, collection
溪胶,當collection
是數組時第二個參數為index
,當collection
是對象時第二個參數為key
稳诚。
iteratee
函數可以通過顯式返回false
提前退出迭代哗脖。
返回值:返回collection
本身
例子:
_.forEach([1, 2], function(value) {
console.log(value);
});
// => Logs `1` then `2`.
_.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
console.log(key);
});
// => Logs 'a' then 'b' (iteration order is not guaranteed).
_.forEachRight
_.forEachRight(collection, [iteratee=_.identity])
和_.forEach
方法的區(qū)別,collection
元素從右到左執(zhí)行iteratee
扳还。
例子:
_.forEachRight([1, 2], function(value) {
console.log(value);
});
// => Logs `2` then `1`.
_.groupBy
_.groupBy(collection, [iteratee=_.identity])
對collection
元素執(zhí)行iteratee
方法,得到key
普办,value
就是該元素工扎。iteratee
方法調用一個參數value
。
返回值:返回key-value
組成的新對象
例子:
_.groupBy([6.1, 4.2, 6.3], Math.floor);
// => { '4': [4.2], '6': [6.1, 6.3] }
// The `_.property` iteratee shorthand.
_.groupBy(['one', 'two', 'three'], 'length');
// => { '3': ['one', 'two'], '5': ['three'] }
_.includes
_.incluede(collection, value, [fromIndex=0])
檢查value
是否在collection
中衔蹲,fromIndex
指定檢查的位置,默認是0
呈础。存在返回true
舆驶,不存在返回false
。
例子:
_.includes([1, 2, 3], 1);
// => true
_.includes([1, 2, 3], 1, 2);
// => false
_.includes({ 'a': 1, 'b': 2 }, 1);
// => true
_.includes('abcd', 'bc');
// => true
_.invokeMap
_.invokeMap(collection, path, [args])
為collection
每個元素調用path
方法而钞,返回調用后的結果組成的新數組沙廉。args
參數將會提供給被調用的方法。
例子:
_.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');
// => [[1, 5, 7], [1, 2, 3]]
_.invokeMap([123, 456], String.prototype.split, '');
// => [['1', '2', '3'], ['4', '5', '6']]
_.keyBy
_.keyBy(collection, [iteratee=_.identity])
返回一個key-value
對象臼节,key
是collection
每個元素執(zhí)行iteratee
后的結果撬陵,對應的value
是最后一個生成該key
的collection
值珊皿。iteratee
調用一個參數value
。
例子:
var array = [
{ 'dir': 'left', 'code': 97 },
{ 'dir': 'right', 'code': 100 },
{ 'dir': 'right', 'code': 99}
];
_.keyBy(array, 'dir');
// => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 99 } }
_.map
_.map(collection, [iteratee=_.identity])
這個就比較簡單了巨税,為collection
的每個元素執(zhí)行iteratee
方法蟋定,得到的結果映射成一個新的數組。
例子:
function square(n) {
return n * n;
}
_.map([4, 8], square);
// => [16, 64]
_.map({ 'a': 4, 'b': 8 }, square);
// => [16, 64] (iteration order is not guaranteed)
var users = [
{ 'user': 'barney' },
{ 'user': 'fred' }
];
// The `_.property` iteratee shorthand.
_.map(users, 'user');
// => ['barney', 'fred']
_.orderBy
_.orderBy(collection, [iteratees=[_.identity], [orders])
這個方法很像_.sortBy
草添,不過_.orderBy
允許指定排序方式iteratees
驶兜。orders
默認是asc
(升序),也可以指定為desc
远寸,返回一個新的有序的數組抄淑。
例子:
var users = [
{ 'user': 'fred', 'age': 48 },
{ 'user': 'barney', 'age': 34 },
{ 'user': 'fred', 'age': 40 },
{ 'user': 'barney', 'age': 36 }
];
// Sort by `user` in ascending order and by `age` in descending order.
_.orderBy(users, ['user', 'age'], ['asc', 'desc']);
// => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
這個例子,排序關鍵字有兩個user
和age
驰后,兩個for
循環(huán)肆资,排序完成一個,在做另一個排序灶芝。
_.partition
_.partition(collection, [predicate=_.identity])
將collection
分成兩組郑原,一組是執(zhí)行predicate
返回true
,另一組是返回false
监署。返回的結果應該是一個二維數組颤专。
例子:
var users = [
{ 'user': 'barney', 'age': 36, 'active': false },
{ 'user': 'fred', 'age': 40, 'active': true },
{ 'user': 'pebbles', 'age': 1, 'active': false }
];
_.partition(users, function(o) { return o.active; });
// => objects for [['fred'], ['barney', 'pebbles']]
// The `_.matches` iteratee shorthand.
_.partition(users, { 'age': 1, 'active': false });
// => objects for [['pebbles'], ['barney', 'fred']]
// The `_.matchesProperty` iteratee shorthand.
_.partition(users, ['active', false]);
// => objects for [['barney', 'pebbles'], ['fred']]
// The `_.property` iteratee shorthand.
_.partition(users, 'active');
// => objects for [['fred'], ['barney', 'pebbles']]
_.reduce
_.reduce(collection, [iteratee=_.identity], [accumulator])
該方法作為一個累加器,把數組中的每個值(從左到右)執(zhí)行iteratee
方法開始縮減钠乏,最終變成一個值栖秕。如果accumulator
沒有給出,collection
的第一個元素被當做初始值晓避。
iteratee
調用四個參數accumulator, value簇捍, index|key, collection
。
例子:
_.reduce([1, 2], function(sum, n) {
return sum + n;
}, 0);
// => 3
_.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
(result[value] || (result[value] = [])).push(key);
return result;
}, {});
// => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
_.reduceRight
_.reduceRight(collection, [iteratee=_.identity], [accumulator])
這個方法與_.reduce()
方法不同的是從右到左計算俏拱。
例子:
var array = [[0, 1], [2, 3], [4, 5]];
_.reduceRight(array, function(flattened, other) {
return flattened.concat(other);
}, []);
// => [4, 5, 2, 3, 0, 1]
_.reject
_.reject(collection, [predicate=_.identity])
這個方法與_.filter
相反暑塑,返回collection
執(zhí)行predicate
返回false
條件的元素組成的新數組。
例子:
var users = [
{ 'user': 'barney', 'age': 36, 'active': false },
{ 'user': 'fred', 'age': 40, 'active': true }
];
_.reject(users, function(o) { return !o.active; });
// => objects for ['fred']
// The `_.matches` iteratee shorthand.
_.reject(users, { 'age': 40, 'active': true });
// => objects for ['barney']
// The `_.matchesProperty` iteratee shorthand.
_.reject(users, ['active', false]);
// => objects for ['fred']
// The `_.property` iteratee shorthand.
_.reject(users, 'active');
// => objects for ['barney']
_.sample
_.sample(collection)
返回collection
中隨機的一個元素锅必。
例子:
_.sample([1, 2, 3, 4]);
// => 2
_.sampleSize
_.sampleSize(collection, [n=1])
返回collection
中隨機的n
個數事格,默認n=1
。
例子:
_.sampleSize([1, 2, 3], 2);
// => [3, 1]
_.sampleSize([1, 2, 3], 4);
// => [2, 3, 1]
_.shuffle
_.shuffle(collection)
把collection
元素的順序隨機打亂搞隐,返回打亂后的collection
驹愚。
例子:
_.shuffle([1, 2, 3, 4]);
// => [4, 1, 3, 2]
_.size
_.size(collection)
返回collection
的length
,collection
可以是Array|Object|string
。
例子:
_.size([1, 2, 3]);
// => 3
_.size({ 'a': 1, 'b': 2 });
// => 2
_.size('pebbles');
// => 7
_.some
_.some(collection, [predicate=_.identity])
對collection
元素執(zhí)行predicate
劣纲,返回布爾值,迭代過程遇到返回false
就停止逢捺。predicate
調用三個參數value, index|key, collection
。
例子:
_.some([null, 0, 'yes', false], Boolean);
// => true
var users = [
{ 'user': 'barney', 'active': true },
{ 'user': 'fred', 'active': false }
];
// The `_.matches` iteratee shorthand.
_.some(users, { 'user': 'barney', 'active': false });
// => false
// The `_.matchesProperty` iteratee shorthand.
_.some(users, ['active', false]);
// => true
// The `_.property` iteratee shorthand.
_.some(users, 'active');
// => true
_.sortBy
_.sortBy(collection, [iteratee=[_.identity]])
按照iteratee
規(guī)則對collection
進行排序癞季。
例子:
var users = [
{ 'user': 'fred', 'age': 48 },
{ 'user': 'barney', 'age': 36 },
{ 'user': 'fred', 'age': 40 },
{ 'user': 'barney', 'age': 34 }
];
_.sortBy(users, [function(o) { return o.user; }]);
// => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
_.sortBy(users, ['user', 'age']);
// => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]