Lodash學習-Collection篇

Yeaseon_Zhang發表於2017-10-12

作者: Yeaseon
Blog:yeaseonzhang.github.io
原文連結

上篇文章,我們已經把關於Array部分的API學習了一遍,現在我們來開始下一篇Collection

下列API的collection引數指代Array | Object兩種型別。

_.countBy

  • _.countBy(collection, [iteratee=_.identity])

建立一個key-value的物件,key是通過將collection按照iteratee規則迭代得到的,對應的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]分別執行Math.floor得到[6, 4, 6],其中4出現1次,6出現2次,所以結果是{ '4': 1, '6': 2 }

_.every

  • _.every(collection, [predicate=_.identity])

如果collection全部元素滿足predicate條件,返回true;否則只要出現不滿足的,就返回falsepredicate呼叫三個引數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全部元素迭代執行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每個元素執行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方法的區別,collection元素從右到左執行iteratee

例子:

_.forEachRight([1, 2], function(value) {
  console.log(value);
});
// => Logs `2` then `1`.複製程式碼

_.groupBy

  • _.groupBy(collection, [iteratee=_.identity])

collection元素執行iteratee方法,得到keyvalue就是該元素。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物件,keycollection每個元素執行iteratee後的結果,對應的value是最後一個生成該keycollection值。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的每個元素執行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允許指定排序方式iterateesorders預設是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]]複製程式碼

這個例子,排序關鍵字有兩個userage,兩個for迴圈,排序完成一個,在做另一個排序。

_.partition

  • _.partition(collection, [predicate=_.identity])

collection分成兩組,一組是執行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])

該方法作為一個累加器,把陣列中的每個值(從左到右)執行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執行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)

返回collectionlength,collection可以是Array|Object|string

例子:

_.size([1, 2, 3]);
// => 3

_.size({ 'a': 1, 'b': 2 });
// => 2

_.size('pebbles');
// => 7複製程式碼

_.some

  • _.some(collection, [predicate=_.identity])

collection元素執行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規則對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]]複製程式碼

相關文章