Skip to content

Collection (集合)

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

引入版本 0.5.0

创建一个对象,其键(key)是 iteratee(迭代函数)遍历 collection(集合)中的每个元素后返回的结果,对应的值(value)是该结果出现的次数。

iteratee 调用时会传入一个参数:(value)

参数

  • collection (Array|Object): 要遍历的集合。
  • [iteratee=_.identity] (Function): 用来转换键的迭代函数。

返回

  • (Object): 返回一个组成的统计对象。

示例

js
_.countBy([6.1, 4.2, 6.3], Math.floor);
// => { '4': 1, '6': 2 }

// 使用 `_.property` 的迭代器简写
_.countBy(["one", "two", "three"], "length");
// => { '3': 2, '5': 1 }

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

引入版本 0.1.0

检查 collection(集合)中的 所有 元素是否都通过了 predicate(断言函数)的真值检查。一旦 predicate 返回假值,遍历就会立即停止。

predicate 调用时会传入三个参数:(value, index|key, collection)

注意: 对于空集合,此方法返回 true

参数

  • collection (Array|Object): 要遍历的集合。
  • [predicate=_.identity] (Function): 每次迭代调用的函数。

返回

  • (boolean): 如果所有元素都通过断言检测返回 true,否则返回 false

示例

js
_.every([true, 1, null, "yes"], Boolean);
// => false

var users = [
  { user: "barney", age: 36, active: false },
  { user: "fred", age: 40, active: false },
];

// 使用 `_.matches` 的迭代器简写
_.every(users, { user: "barney", active: false });
// => false

// 使用 `_.matchesProperty` 的迭代器简写
_.every(users, ["active", false]);
// => true

// 使用 `_.property` 的迭代器简写
_.every(users, "active");
// => false

_.filter(collection, [predicate=_.identity])

引入版本 0.1.0

遍历 collection(集合)中的元素,返回一个包含所有通过 predicate(断言函数)真值检测的元素的新数组。

predicate 调用时会传入三个参数:(value, index|key, collection)

注意: 不同于 _.remove,该方法返回一个新的数组(不会改变原集合)。

参数

  • collection (Array|Object): 待遍历的集合。
  • [predicate=_.identity] (Function): 每次迭代调用的函数。

返回

  • (Array): 返回过滤后的新数组。

示例

js
var users = [
  { user: "barney", age: 36, active: true },
  { user: "fred", age: 40, active: false },
];

_.filter(users, function (o) {
  return !o.active;
});
// => objects for ['fred']

// 使用 `_.matches` 的迭代器简写
_.filter(users, { age: 36, active: true });
// => objects for ['barney']

// 使用 `_.matchesProperty` 的迭代器简写
_.filter(users, ["active", false]);
// => objects for ['fred']

// 使用 `_.property` 的迭代器简写
_.filter(users, "active");
// => objects for ['barney']

_.find(collection, [predicate=_.identity], [fromIndex=0])

引入版本 0.1.0

遍历 collection(集合)中的元素,返回第一个通过 predicate(断言函数)真值检测的元素。

predicate 调用时会传入三个参数:(value, index|key, collection)

参数

  • collection (Array|Object): 待检索的集合。
  • [predicate=_.identity] (Function): 每次迭代调用的函数。
  • [fromIndex=0] (number): 开始搜索的索引位置。

返回

  • (*): 返回匹配的元素,否则返回 undefined

示例

js
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'

// 使用 `_.matches` 的迭代器简写
_.find(users, { age: 1, active: true });
// => object for 'pebbles'

// 使用 `_.matchesProperty` 的迭代器简写
_.find(users, ["active", false]);
// => object for 'fred'

// 使用 `_.property` 的迭代器简写
_.find(users, "active");
// => object for 'barney'

_.findLast(collection, [predicate=_.identity], [fromIndex=collection.length-1])

引入版本 2.0.0

这个方法类似 _.find,区别在于它是从右到左(即反向)遍历 collection(集合)中的元素。

参数

  • collection (Array|Object): 待检索的集合。
  • [predicate=_.identity] (Function): 每次迭代调用的函数。
  • [fromIndex=collection.length-1] (number): 开始搜索的索引位置。

返回

  • (*): 返回匹配的元素,否则返回 undefined

示例

js
_.findLast([1, 2, 3, 4], function (n) {
  return n % 2 == 1;
});
// => 3

_.flatMap(collection, [iteratee=_.identity])

引入版本 4.0.0

创建一个扁平化的数组,先遍历 collection(集合)中的每个元素并调用 iteratee(迭代函数),然后将映射结果扁平化(相当于先调用 map 再调用 flatten,深度为 1)。

iteratee 调用时会传入三个参数:(value, index|key, collection)

参数

  • collection (Array|Object): 待遍历的集合。
  • [iteratee=_.identity] (Function): 每次迭代调用的函数。

返回

  • (Array): 返回新的扁平化数组。

示例

js
function duplicate(n) {
  return [n, n];
}

_.flatMap([1, 2], duplicate);
// => [1, 1, 2, 2]

_.flatMapDeep(collection, [iteratee=_.identity])

引入版本 4.7.0

该方法类似 _.flatMap,区别在于它会 递归地 扁平化映射后的结果。

参数

  • collection (Array|Object): 要遍历的集合。
  • [iteratee=_.identity] (Function): 每次迭代调用的函数。

返回

  • (Array): 返回新的扁平化数组。

示例

js
function duplicate(n) {
  return [[[n, n]]];
}

_.flatMapDeep([1, 2], duplicate);
// => [1, 1, 2, 2]

_.flatMapDepth(collection, [iteratee=_.identity], [depth=1])

引入版本 4.7.0

该方法类似 _.flatMap,区别在于它会根据指定的 depth(深度)递归地扁平化映射后的结果。

参数

  • collection (Array|Object): 待遍历的集合。
  • [iteratee=_.identity] (Function): 每次迭代调用的函数。
  • [depth=1] (number): 最大递归深度。

返回

  • (Array): 返回新的扁平化数组。

示例

js
function duplicate(n) {
  return [[[n, n]]];
}

_.flatMapDepth([1, 2], duplicate, 2);
// => [[1, 1], [2, 2]]

_.forEach(collection, [iteratee=_.identity])

引入版本 0.1.0

遍历 collection(集合)中的元素,并为每个元素调用 iteratee(迭代函数)。

iteratee 调用时会传入三个参数:(value, index|key, collection)。如果迭代函数显式返回 false,迭代会提前退出。

注意: 与其他 "Collection" 方法一样,拥有 "length" 属性的对象会被视为类数组对象进行遍历。如果想避免这种行为(即按对象属性遍历),请使用 _.forIn_.forOwn

别名: _.each

参数

  • collection (Array|Object): 待遍历的集合。
  • [iteratee=_.identity] (Function): 每次迭代调用的函数。

返回

  • (*): 返回 collection(集合本身)。

示例

js
_.forEach([1, 2], function (value) {
  console.log(value);
});
// => 输出 `1` 然后是 `2`。

_.forEach({ a: 1, b: 2 }, function (value, key) {
  console.log(key);
});
// => 输出 'a' 然后是 'b' (不保证迭代顺序)。

_.forEachRight(collection, [iteratee=_.identity])

引入版本 2.0.0

这个方法类似 _.forEach,区别在于它是从右到左(即反向)遍历 collection(集合)中的元素。

别名: _.eachRight

参数

  • collection (Array|Object): 要遍历的集合。
  • [iteratee=_.identity] (Function): 每次迭代调用的函数。

返回

  • (*): 返回 collection(集合本身)。

示例

js
_.forEachRight([1, 2], function (value) {
  console.log(value);
});
// => 输出 `2` 然后是 `1`。

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

引入版本 0.1.0

创建一个对象,key 是 iteratee(迭代函数)遍历 collection(集合)中的每个元素返回的结果。分组值的顺序由它们在 collection 中出现的顺序决定。每个 key 对应的值(value)是负责生成该 key 的元素组成的数组。

iteratee 调用时会传入一个参数:(value)

参数

  • collection (Array|Object): 要遍历的集合。
  • [iteratee=_.identity] (Function): 用来转换键的迭代函数。

返回

  • (Object): 返回聚合后的对象。

示例

js
_.groupBy([6.1, 4.2, 6.3], Math.floor);
// => { '4': [4.2], '6': [6.1, 6.3] }

// 使用 `_.property` 的迭代器简写
_.groupBy(["one", "two", "three"], "length");
// => { '3': ['one', 'two'], '5': ['three'] }

_.includes(collection, value, [fromIndex=0])

引入版本 0.1.0

检查 value 是否在 collection(集合)中。如果 collection 是一个字符串,那么检查 value 是否为子字符串。否则,使用 SameValueZero 进行相等比较。如果 fromIndex 是负数,则将其用作从 collection 末尾开始的偏移量。

参数

  • collection (Array|Object|string): 要检查的集合。
  • value (*): 要搜索的值。
  • [fromIndex=0] (number): 开始搜索的索引位置。

返回

  • (boolean): 如果找到 value 返回 true,否则返回 false

示例

js
_.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(collection, path, [args])

引入版本 4.0.0

调用 collection(集合)中每个元素的 path(路径)上的方法,并返回一个包含每次调用结果的数组。任何附加的参数都会在调用每个方法时传入。如果 path 是一个函数,它会被调用,并且 this 会绑定到 collection 中的每个元素。

参数

  • collection (Array|Object): 待遍历的集合。
  • path (Array|Function|string): 要调用的方法路径或每次迭代调用的函数。
  • [args] (...*): 调用每个方法时传入的参数。

返回

  • (Array): 返回结果数组。

示例

js
_.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(collection, [iteratee=_.identity])

引入版本 4.0.0

创建一个对象,组成该对象的键(key)是通过 iteratee(迭代函数)遍历 collection(集合)中的每个元素生成的结果。每个键对应的值(value)是最后一个生成该键的元素(如果多个元素生成相同的键,后面的会覆盖前面的)。

iteratee 调用时会传入一个参数:(value)

参数

  • collection (Array|Object): 待遍历的集合。
  • [iteratee=_.identity] (Function): 用来转换键的迭代函数。

返回

  • (Object): 返回组成的聚合对象。

示例

js
var array = [
  { dir: "left", code: 97 },
  { dir: "right", code: 100 },
];

_.keyBy(array, function (o) {
  return String.fromCharCode(o.code);
});
// => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }

_.keyBy(array, "dir");
// => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }

_.map(collection, [iteratee=_.identity])

引入版本 0.1.0

创建一个新数组,其元素是 iteratee(迭代函数)遍历 collection(集合)中的每个元素后的返回结果。

iteratee 调用时会传入三个参数:(value, index|key, collection)

注意: 许多 Lodash 方法(如 parseInt)都被设计为可以安全地作为 iteratee 使用,它们会忽略多余的参数(这与原生 map 配合 parseInt 时经常出的错不同)。

参数

  • collection (Array|Object): 待遍历的集合。
  • [iteratee=_.identity] (Function): 每次迭代调用的函数。

返回

  • (Array): 返回映射后的新数组。

示例

js
function square(n) {
  return n * n;
}

_.map([4, 8], square);
// => [16, 64]

_.map({ a: 4, b: 8 }, square);
// => [16, 64] (不保证迭代顺序)

var users = [{ user: "barney" }, { user: "fred" }];

// 使用 `_.property` 的迭代器简写
_.map(users, "user");
// => ['barney', 'fred']

_.orderBy(collection, [iteratees=[_.identity]], [orders])

引入版本 4.0.0

此方法类似 _.sortBy,区别在于它允许指定 iteratees(迭代函数/属性)的排序顺序。如果未指定 orders,所有值默认按 升序 排序。否则,请指定 "desc"降序,或 "asc"升序

参数

  • collection (Array|Object): 要遍历的集合。
  • [iteratees=[_.identity]] (Array[]|Function[]|Object[]|string[]): 排序的依据。
  • [orders] (string[]): iteratees 对应的排序顺序。

返回

  • (Array): 返回排序后的新数组。

示例

js
var users = [
  { user: "fred", age: 48 },
  { user: "barney", age: 34 },
  { user: "fred", age: 40 },
  { user: "barney", age: 36 },
];

// 以 `user` 升序排序,再以 `age` 降序排序。
_.orderBy(users, ["user", "age"], ["asc", "desc"]);
// => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]

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

引入版本 3.0.0

创建一个元素数组,被拆分为两组:第一组包含 predicate(断言函数)返回为真值(truthy)的元素,第二组包含 predicate 返回为假值(falsey)的元素。

predicate 调用时会传入一个参数:(value)

参数

  • collection (Array|Object): 待遍历的集合。
  • [predicate=_.identity] (Function): 每次迭代调用的函数。

返回

  • (Array): 返回分组元素后的数组。(第一个元素是真值组,第二个元素是假值组)。

示例

js
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']]

// 使用 `_.matches` 的迭代器简写
_.partition(users, { age: 1, active: false });
// => objects for [['pebbles'], ['barney', 'fred']]

// 使用 `_.matchesProperty` 的迭代器简写
_.partition(users, ["active", false]);
// => objects for [['barney', 'pebbles'], ['fred']]

// 使用 `_.property` 的迭代器简写
_.partition(users, "active");
// => objects for [['fred'], ['barney', 'pebbles']]

_.reduce(collection, [iteratee=_.identity], [accumulator])

引入版本 0.1.0

collection(集合)归约为一个值。这个值是通过 iteratee(迭代函数)遍历 collection 中的每个元素,将每次调用的结果累积起来得到的。如果不提供 accumulator(累加器/初始值),则使用 collection 的第一个元素作为初始值。

iteratee 调用时会传入四个参数:(accumulator, value, index|key, collection)

参数

  • collection (Array|Object): 待遍历的集合。
  • [iteratee=_.identity] (Function): 每次迭代调用的函数。
  • [accumulator] (*): 初始值。

返回

  • (*): 返回累积的值。

示例

js
_.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'] } (不保证迭代顺序)

_.reduceRight(collection, [iteratee=_.identity], [accumulator])

引入版本 0.1.0

这个方法类似 _.reduce,区别在于它是从右到左(即反向)遍历 collection(集合)中的元素。

参数

  • collection (Array|Object): 待遍历的集合。
  • [iteratee=_.identity] (Function): 每次迭代调用的函数。
  • [accumulator] (*): 初始值。

返回

  • (*): 返回累积的值。

示例

js
var array = [
  [0, 1],
  [2, 3],
  [4, 5],
];

_.reduceRight(
  array,
  function (flattened, other) {
    return flattened.concat(other);
  },
  []
);
// => [4, 5, 2, 3, 0, 1]

_.reject(collection, [predicate=_.identity])

引入版本 0.1.0

_.filter 的反向操作;此方法返回 collection(集合)中 predicate(断言函数) 返回真值(truthy)的元素。(即排除掉符合条件的元素)。

参数

  • collection (Array|Object): 待遍历的集合。
  • [predicate=_.identity] (Function): 每次迭代调用的函数。

返回

  • (Array): 返回过滤后的新数组。

示例

js
var users = [
  { user: "barney", age: 36, active: false },
  { user: "fred", age: 40, active: true },
];

_.reject(users, function (o) {
  return !o.active;
});
// => objects for ['fred']

// 使用 `_.matches` 的迭代器简写
_.reject(users, { age: 40, active: true });
// => objects for ['barney']

// 使用 `_.matchesProperty` 的迭代器简写
_.reject(users, ["active", false]);
// => objects for ['fred']

// 使用 `_.property` 的迭代器简写
_.reject(users, "active");
// => objects for ['barney']

_.sample(collection)

引入版本 2.0.0

collection(集合)中随机获取一个元素。

参数

  • collection (Array|Object): 要采样的集合。

返回

  • (*): 返回随机元素。

示例

js
_.sample([1, 2, 3, 4]);
// => 2

_.sampleSize(collection, [n=1])

引入版本 4.0.0

collection(集合)中获取 n 个随机元素。

参数

  • collection (Array|Object): 要采样的集合。
  • [n=1] (number): 要获取的元素个数。

返回

  • (Array): 返回随机元素组成的数组。

示例

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

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

_.shuffle(collection)

引入版本 0.1.0

创建一个打乱顺序后的数组副本,使用洗牌算法的一个版本。

参数

  • collection (Array|Object): 要打乱顺序的集合。

返回

  • (Array): 返回打乱顺序后的新数组。

示例

js
_.shuffle([1, 2, 3, 4]);
// => [4, 1, 3, 2]

_.size(collection)

引入版本 0.1.0

获取 collection(集合)的大小。对于数组或类数组对象,返回其长度;对于对象,返回其自身可枚举属性的个数。

参数

  • collection (Array|Object|string): 待检查的集合。

返回

  • (number): 返回集合的大小。

示例

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

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

_.size("pebbles");
// => 7

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

引入版本 0.1.0

检查 collection(集合)中是否 存在 任意元素通过了 predicate(断言函数)的真值检查。一旦 predicate 返回真值,遍历就会立即停止。

predicate 调用时会传入三个参数:(value, index|key, collection)

参数

  • collection (Array|Object): 待遍历的集合。
  • [predicate=_.identity] (Function): 每次迭代调用的函数。

返回

  • (boolean): 如果任意元素通过断言检测返回 true,否则返回 false

示例

js
_.some([null, 0, "yes", false], Boolean);
// => true

var users = [
  { user: "barney", active: true },
  { user: "fred", active: false },
];

// 使用 `_.matches` 的迭代器简写
_.some(users, { user: "barney", active: false });
// => false

// 使用 `_.matchesProperty` 的迭代器简写
_.some(users, ["active", false]);
// => true

// 使用 `_.property` 的迭代器简写
_.some(users, "active");
// => true

_.sortBy(collection, [iteratees=[_.identity]])

引入版本 0.1.0

创建一个元素数组。通过 iteratee(迭代函数)遍历集合中的每个元素,根据返回的结果进行 升序 排序。这个方法执行 稳定排序(stable sort),即它会保留相等元素在原数组中的相对顺序。

iteratee 调用时会传入一个参数:(value)

参数

  • collection (Array|Object): 待遍历的集合。
  • [iteratees=[_.identity]] (...(Function|Function[])): 排序的依据(可以是函数或属性名)。

返回

  • (Array): 返回排序后的新数组。

示例

js
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]]