好用的前端工具Lodash --- 数组篇

200 阅读11分钟

贼好用的前端工具Lodash ---数组

Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库。
Lodash 通过降低 array、number、objects、string 等等的使用难度从而让 JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:

  • 遍历 array、object 和 string
  • 对值进行操作和检测
  • 创建符合功能的函数

安装

npm i --save lodash
// 或
yarn add lodash

引入

import _ from 'lodash'

数组

_.chunk 拆分数组(一维转二维)

将数组(array)拆分成多个 size 长度的区块,并将这些区块组成一个新数组。 如果array 无法被分割成全部等长的区块,那么最后剩余的元素将组成一个区块。
语法

_.chunk(array, [size=1])

参数
1.  array  (Array) : 需要处理的数组
2.  [size=1]  (number) : 每个数组区块的长度,size默认为1

返回
(Array) : 返回一个包含拆分区块的新数组(注:相当于一个二维数组)。

示例

const arr =['a', 'b', 'c', 'd']
console.log(_.chunk(arr)); // [['a'],['b'],['c'],['d']]

const arr =['a', 'b', 'c', 'd']
console.log(_.chunk(arr, 3)); // [['a', 'b', 'c'],['d']]

_.compact 过滤假值元素

创建一个新数组,包含原数组中所有的非假值元素。例如falsenull,0""undefined, 和 NaN 都是被认为是“假值”。
语法

_.compact(array)

参数
array (Array): 待处理的数组
返回值
(Array): 返回过滤掉假值的新数组。

示例

const arr = ['a', false, true, 0, '', null, undefined, NaN, 'b']
console.log(_.compact(arr)); // ['a', true, 'b']

_.concat 连接数组

创建一个新数组,将array与任何数组 或 值连接在一起。
语法

_.concat(array, [values])

参数
array (Array): 被连接的数组。
[values] (...*): 连接的值。
返回值
(Array): 返回连接后的新数组。

示例

const arr =['a', 'b']
// _.concat
const arr2 = [2, 'hi', [3, [4]]]
console.log(_.concat(['l'],arr, arr2, 'w')); // ['l', 'a', 'b', 2, 'hi', [3, [4]], 'w]

_.difference 比较差异

创建一个具有唯一array值的数组,每个值不包含在其他给定的数组中。(注:即创建一个新数组,这个数组中的值,为第一个数字(array 参数)排除了给定数组中的值。)结果值的顺序是由第一个数组中的顺序确定。
语法

_.difference(array, [values])

参数
array (Array): 要检查的数组。
[values] (...Array): 排除的值。
返回值
(Array): 返回一个过滤值后的新数组。

示例

const arr = [1, 4, 3, 'a', 'b', 0]
const arr1 = ['a', 'b', 2, 1]
console.log(_.difference(arr, arr1, [4])); // [3, 0]

_.take 提取元素

创建一个数组切片,从array数组的起始元素开始提取n个元素。

_.takeRight(array, [n=1]): 创建一个数组切片,从array数组的最后一个元素开始提取n个元素。

语法

_.take(array, [n=1])

参数
array (Array): 要检索的数组。
[n=1] (number): 要提取的元素个数。
返回
(Array): 返回 array 数组的切片(从起始元素开始n个元素)。

示例

_.take([1, 2, 3]);
// => [1]
 
_.take([1, 2, 3], 2);
// => [1, 2]
 
_.take([1, 2, 3], 5);
// => [1, 2, 3]
 
_.take([1, 2, 3], 0);
// => []

_.drop 去除元素

创建一个切片数组,去除array前面的n个元素。(n默认值为1。)
语法

_.drop(array, [n=1])

参数
array (Array): 要查询的数组。
[n=1] (number): 要去除的元素个数。
返回值
(Array): 返回array剩余切片。

示例

const arr = [1, 2, 3]

_.drop(arr);
// => [2, 3]
 
_.drop(arr, 2);
// => [3]
 
_.drop(arr, 5);
// => []
 
_.drop(arr, 0);
// => [1, 2, 3]

_.dropWhile

创建一个切片数组,去除array中从起点开始到 predicate 返回假值结束部分。predicate 会传入3个参数: (value, index, array)。
语法

_.dropWhile(array, [predicate=_.identity])

参数
array (Array): 要查询的数组。
[predicate=_.identity] (Function): 这个函数会在每一次迭代调用。
返回值
(Array): 返回array剩余切片。

示例

var users = [
  { 'user': 'barney',  'active': false },
  { 'user': 'fred',    'active': false },
  { 'user': 'pebbles', 'active': true }
];
 
_.dropWhile(users, function(o) { return !o.active; });
// => objects for ['pebbles']
 
// The `_.matches` iteratee shorthand.
_.dropWhile(users, { 'user': 'barney', 'active': false });
// => objects for ['fred', 'pebbles']
 
// The `_.matchesProperty` iteratee shorthand.
_.dropWhile(users, ['active', false]);
// => objects for ['pebbles']
 
// The `_.property` iteratee shorthand.
_.dropWhile(users, 'active');
// => objects for ['barney', 'fred', 'pebbles']

_.dropRight

创建一个切片数组,去除array尾部的n个元素。(n默认值为1。)
语法

_.dropRight(array, [n=1])

参数
array (Array): 要查询的数组。
[n=1] (number): 要去除的元素个数。
返回值
(Array): 返回array剩余切片。

示例

const arr = [1, 2, 3]

_.dropRight(arr);
// => [1, 2]
 
_.dropRight(arr, 2);
// => [1]
 
_.dropRight(arr, 5);
// => []
 
_.dropRight(arr, 0);
// => [1, 2, 3]

_.dropRightWhile

创建一个切片数组,去除array中从 predicate 返回假值开始到尾部的部分。predicate 会传入3个参数: (value, index, array)。

语法

_.dropRightWhile(array, [predicate=_.identity])

参数
array (Array): 要查询的数组。
[predicate=_.identity] (Function): 这个函数会在每一次迭代调用。
返回值
(Array): 返回array剩余切片。

示例

var users = [
  { 'user': 'barney',  'active': true },
  { 'user': 'fred',    'active': false },
  { 'user': 'pebbles', 'active': false }
];
 
_.dropRightWhile(users, function(o) { return !o.active; });
// => objects for ['barney']
 
// The `_.matches` iteratee shorthand.
_.dropRightWhile(users, { 'user': 'pebbles', 'active': false });
// => objects for ['barney', 'fred']
 
// The `_.matchesProperty` iteratee shorthand.
_.dropRightWhile(users, ['active', false]);
// => objects for ['barney']
 
// The `_.property` iteratee shorthand.
_.dropRightWhile(users, 'active');
// => objects for ['barney', 'fred', 'pebbles']

_.fill 填充

使用 value 值来填充(替换) array,从start位置开始, 到end位置结束(但不包含end位置)。 Note: 这个方法会改变 array(注:不是创建新数组)。
语法

_.fill(array, value, [start=0], [end=array.length])

参数
array (Array): 要填充改变的数组。
value (*): 填充给 array 的值。
[start=0] (number): 开始位置(默认0)。
[end=array.length] (number):结束位置(默认array.length)。
返回值
(Array): 返回 array

示例

var arr = [1, 2, 3];
 
_.fill(arr, 'a');
console.log(arr);
// => ['a', 'a', 'a']
 
_.fill(arr(3), 2);
// => [2, 2, 2]
 
_.fill([4, 6, 8, 10], '*', 1, 3);
// => [4, '*', '*', 10]

_.findIndex 查询元素

该方法返回第一个通过 predicate 判断为真值的元素的索引值(index),而不是元素本身。

语法

_.findIndex(array, [predicate=_.identity], [fromIndex=0])

参数
array (Array): 要搜索的数组。
[predicate=_.identity] (Array|Function|Object|string): 这个函数会在每一次迭代调用。
[fromIndex=0] (number): The index to search from.
返回值
(number): 返回找到元素的 索引值(index),否则返回 -1

示例

var users = [
  { 'user': 'barney',  'active': false },
  { 'user': 'fred',    'active': false },
  { 'user': 'pebbles', 'active': true }
];
 
_.findIndex(users, function(o) { return o.user == 'barney'; });
// => 0
 
// The `_.matches` iteratee shorthand.
_.findIndex(users, { 'user': 'fred', 'active': false });
// => 1
 
// The `_.matchesProperty` iteratee shorthand.
_.findIndex(users, ['active', false]);
// => 0
 
// The `_.property` iteratee shorthand.
_.findIndex(users, 'active');
// => 2

_.findLastIndex

这个方式类似_.findIndex, 区别是它是从右到左的迭代集合array中的元素。

语法

_.findLastIndex(array, [predicate=_.identity], [fromIndex=array.length-1])

参数
array (Array): 要搜索的数组。
[predicate=_.identity] (Array|Function|Object|string): 这个函数会在每一次迭代调用。
[fromIndex=array.length-1] (number): The index to search from.
返回值
(number): 返回找到元素的 索引值(index),否则返回 -1

示例

var users = [
  { 'user': 'barney',  'active': true },
  { 'user': 'fred',    'active': false },
  { 'user': 'pebbles', 'active': false }
];
 
_.findLastIndex(users, function(o) { return o.user == 'pebbles'; });
// => 2
 
// The `_.matches` iteratee shorthand.
_.findLastIndex(users, { 'user': 'barney', 'active': true });
// => 0
 
// The `_.matchesProperty` iteratee shorthand.
_.findLastIndex(users, ['active', false]);
// => 2
 
// The `_.property` iteratee shorthand.
_.findLastIndex(users, 'active');
// => 0

_.first _.head 首元素

获取数组 array 的第一个元素。
别名 _.first
语法

_.head(array)

参数
array (Array): 要查询的数组。
返回值
(*): 返回数组 array的第一个元素。

示例

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

_.last 尾元素

获取array中的最后一个元素。

语法

_.last(array)

参数
array (Array): 要检索的数组。
返回值
(*): 返回array中的最后一个元素

示例

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

_.flatten

减少一级array嵌套深度。

语法

_.flatten(array)

参数
array (Array): 需要减少嵌套层级的数组。
返回值
(Array): 返回减少嵌套层级后的新数组。

示例

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

_.flattenDeep 多维转一维

将array递归为一维数组。

语法

_.flattenDeep(array)

参数
array (Array): 需要处理的数组。
返回值
(Array): 返回一个的新一维数组。

示例

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

_.flattenDepth 减少数组嵌套

根据 depth 递归减少 array 的嵌套层级

语法

_.flattenDepth(array, [depth=1])

参数
array (Array): 需要减少嵌套层级的数组。
[depth=1] (number):最多减少的嵌套层级数。
返回值
(Array): 返回减少嵌套层级后的新数组。

示例

var array = [1, [2, [3, [4]], 5]];
 
_.flattenDepth(array, 1);
// => [1, 2, [3, [4]], 5]
 
_.flattenDepth(array, 2);
// => [1, 2, 3, [4], 5]

示例

_.fromPairs([['fred', 30], ['barney', 40]]);
// => { 'fred': 30, 'barney': 40 }

_.indexOf (right -> left遍历)

返回首次 value 在数组array中被找到的 索引值, 如果 fromIndex 为负值,将从数组array尾端索引进行匹配。

语法

_.indexOf(array, value, [fromIndex=0])

参数
array (Array): 需要查找的数组。
value (*): 需要查找的值。
[fromIndex=0] (number): 开始查询的位置。
返回值
(number): 返回 值value在数组中的索引位置, 没有找到为返回-1。

示例

const arr = [1, 2, 1, 2]

_.indexOf(arr, 2);
// => 1
 
_.indexOf(arr, 2, 2);
// => 3

_.lastIndexOf (left -> right遍历)

这个方法类似_.indexOf ,区别是它是从右到左遍历array的元素。

语法

_.lastIndexOf(array, value, [fromIndex=array.length-1])

参数
array (Array): 要搜索的数组。
value (*): 要搜索的值。
[fromIndex=array.length-1] (number): 开始搜索的索引值。
返回值
(number): 返回匹配值的索引值,否则返回 -1

_.initial 获取非尾元素

获取数组array中除了最后一个元素之外的所有元素(注:去除数组array中的最后一个元素)。
语法

_.initial(array)

参数
1. array  *(Array)* : 要查询的数组。
返回值
(Array) : 返回截取后的数组array

示例

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

_.tial 获取非尾=首元素

获取除了array数组第一个元素以外的全部元素。
语法

_.tail(array)

参数
array  (Array) : 要检索的数组。
返回
(Array): 返回 array 数组的切片(除了array数组第一个元素以外的全部元素)。

示例

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

_.intersection

创建唯一值的数组,这个数组包含所有给定数组都包含的元素。(注:可以理解为给定数组的交集)

语法

_.intersection([arrays])

参数
[arrays] (...Array): 待检查的数组。
返回值
(Array): 返回一个包含所有传入数组交集元素的新数组。

示例

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

示例

_.lastIndexOf([1, 2, 1, 2], 2);
// => 3
 
// Search from the `fromIndex`.
_.lastIndexOf([1, 2, 1, 2], 2, 2);
// => 1

_.nth 获取第n个元素

获取array数组的第n个元素。如果n为负数,则返回从数组结尾开始的第n个元素。

语法

_.nth(array, [n=0])

参数
array (Array): 要查询的数组。
[n=0] (number): 要返回元素的索引值。
返回值
(*): 获取array数组的第n个元素。

示例

var array = ['a', 'b', 'c', 'd'];
 
_.nth(array, 1);
// => 'b'
 
_.nth(array, -2);
// => 'c';

_.pull 移除

移除数组array中所有和给定值相等的元素,使用SameValueZero 进行全等比较。

注意: 和_.without 方法不同,这个方法会改变数组。使用_.remove 从一个数组中移除元素。

语法

_.pull(array, [values])

参数
array (Array): 要修改的数组。
[values] (...*): 要删除的值。
返回值
(Array): 返回 array.

示例

var array = [1, 2, 3, 1, 2, 3];
 
_.pull(array, 2, 3);
console.log(array);
// => [1, 1]

_.pullAll 移除

这个方法类似_.pull,区别是这个方法接收一个要移除值的数组。

Note: 不同于_.difference, 这个方法会改变数组 array。

语法

_.pullAll(array, values)

参数
array (Array): 要修改的数组。
values (Array): 要移除值的数组。
返回值
(Array): 返回 array

示例

var array = [1, 2, 3, 1, 2, 3];
 
_.pullAll(array, [2, 3]);
console.log(array);
// => [1, 1]

_.pullAt 移除

根据索引 indexes,移除array中对应的元素,并返回被移除元素的数组。

Note: 和_.at不同, 这个方法会改变数组 array。

语法

_.pullAt(array, [indexes])

参数
array (Array): 要修改的数组。
[indexes] (...(number|number[])): 要移除元素的索引。
返回值
(Array): 返回移除元素组成的新数组。

示例

var array = [5, 10, 15, 20];
var evens = _.pullAt(array, 1, 3);
 
console.log(array);
// => [5, 15]
 
console.log(evens);
// => [10, 20]

_.remove 移除

移除数组中predicate(断言)返回为真值的所有元素,并返回移除元素组成的数组。predicate(断言) 会传入3个参数: (value, index, array)。

Note: 和_.filter不同, 这个方法会改变数组 array。使用_.pull来根据提供的value值从数组中移除元素。

语法

_.remove(array, [predicate=_.identity])

参数
array (Array): 要修改的数组。
[predicate=_.identity] (Array|Function|Object|string): 每次迭代调用的函数。
返回
(Array): 返回移除元素组成的新数组。

示例

var array = [1, 2, 3, 4];
var evens = _.remove(array, function(n) {
  return n % 2 == 0;
});
 
console.log(array);
// => [1, 3]
 
console.log(evens);
// => [2, 4]

_.reverse 反转

反转array,使得第一个元素变为最后一个元素,第二个元素变为倒数第二个元素,依次类推。

Note: 这个方法会改变原数组 array,基于Array#reverse.

语法

_.reverse(array)

参数
array (Array): 要修改的数组。
返回
(Array): 返回 array.

示例

var array = [1, 2, 3];
 
_.reverse(array);
// => [3, 2, 1]
 
console.log(array);
// => [3, 2, 1]

_.slice 裁剪

裁剪数组array,从 start 位置开始到end结束,但不包括 end 本身的位置。

Note: 这个方法用于代替Array#slice 来确保数组正确返回。

语法

_.slice(array, [start=0], [end=array.length])

参数
array (Array): 要裁剪数组。
[start=0] (number): 开始位置。
[end=array.length] (number): 结束位置。
返回
(Array): 返回 数组array 裁剪部分的新数组。

示例

var array = [1, 2, 3];
 
_.reverse(array);
// => [3, 2, 1]
 
console.log(array);
// => [3, 2, 1]

_.uniq 去重

创建一个去重后的array数组副本。使用了SameValueZero 做等值比较。只有第一次出现的元素才会被保留。
语法

_.uniq(array)

参数
array (Array): 要检查的数组。
返回
(Array): 返回新的去重后的数组。

示例

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

_.without 剔除

创建一个剔除所有给定值的新数组,剔除值的时候,使用SameValueZero做相等比较。

注意: 不像_.pull, 这个方法会返回一个新数组。

语法

_.without(array, [values])

参数
array (Array): 要检查的数组。
[values] (...*): 要剔除的值。
返回
(Array): 返回过滤值后的新数组。

示例

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

_.zipObject array -> object

这个方法类似_.fromPairs,除了它接受2个数组,第一个数组中的值作为属性标识符(属性名),第二个数组中的值作为相应的属性值。

语法

_.zipObject([props=[]], [values=[]])

参数
[props=[]] (Array): The property identifiers.
[values=[]] (Array): The property values.
返回
(Object): Returns the new object.

示例

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

_.fromPairs (array -> object)

返回一个由键值对pairs构成的对象。

语法

_.fromPairs(pairs)

参数
pairs (Array): 键值对pairs。
返回值
(Object): 返回一个新对象。

示例

_.fromPairs([['fred', 30], ['barney', 40]]);
// => { 'fred': 30, 'barney': 40 }

参考:Lodash 简介 | Lodash中文文档 | Lodash中文网 (lodashjs.com)