Lodash
1.什么是Lodash?
- Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库。其对各种方法、函数的封装,使得使用更加方便。
2.为什么使用Lodash?
Lodash 通过降低 array、number、objects、string 等等的使用难度从而让 JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:
- 遍历 array、object 和 string
- 对值进行操作和检测
- 对值进行操作和检测
- 创建符合功能的函数
3.安装使用
- 浏览器环境
<script src="lodash.js"></script>
- 通过Npm
npm i -g npm
npm i --save lodash
- Node环境中使用
// 引入所有模块
var _ = require('lodash');
// 引入核心模块
var _ = require('lodash/core');
// 引入函数式编程模块
var fp = require('lodash/fp')
常用函数
数组
-
_.chunk(array,[size=1])
将数组(array)拆分成多个 size 长度的区块,并将这些区块组成一个新数组。 如果array 无法被分割成全部等长的区块,那么最后剩余的元素将组成一个区块。
_.chunk([1,2,3,4,5,6,7,8,9],2) // [[1,2],[3,4],[5,6],[7,8],[9]]
-
_.compact(array)
创建一个新数组,包含原数组中所有的非假值元素。例如false, null,0, "", undefined, 和 NaN 都是被认为是“假值”。
_.compact([0, 1, false, 2, '', 3]);
// => [1, 2, 3]
-
_.concat(array, [values])
创建一个新数组,将array与任何数组 或 值连接在一起。
var array = [1]
var other = _.concat(array, 2, [3], [[4]])
console.log(other) // => [1, 2, 3, [4]]
console.log(array) // => [1]
-
_.difference(array, [values])
创建一个具有唯一array值的数组,每个值不包含在其他给定的数组中。(注:即创建一个新数组,这个数组中的值,为第一个数字(array 参数)排除了给定数组中的值。)该方法使用SameValueZero做相等比较。结果值的顺序是由第一个数组中的顺序确定
var array = [1]
var other = _.concat(array, 2, [3], [[4]])
console.log(other) // => [1, 2, 3, [4]]
console.log(array) // => [1]
-
.differenceBy(array, [values], [iteratee=.identity])
这个方法类似_.difference ,除了它接受一个 iteratee (注:迭代器), 调用array 和 values 中的每个元素以产生比较的标准。 结果值是从第一数组中选择。iteratee 会调用一个参数:(value)。(注:首先使用迭代器分别迭代array 和 values中的每个元素,返回的值作为比较值)
var array = [1]
var other = _.concat(array, 2, [3], [[4]])
console.log(other) // => [1, 2, 3, [4]]
console.log(array) // => [1]
-
_.drop(array, [n=1])
创建一个切片数组,去除array前面的n个元素。(n默认值为1。)
_.drop([1, 2, 3]) // => [2, 3]
_.drop([1, 2, 3], 2) // => [3]
_.drop([1, 2, 3], 5) // => []
_.drop([1, 2, 3], 0) // => [1, 2, 3]
-
_.dropRight(array, [n=1])
这个方法类似_.difference ,除了它接受一个 comparator (注:比较器),它调用比较array,values中的元素。 结果值是从第一数组中选择。comparator 调用参数有两个:(arrVal, othVal)。
_.dropRight([1, 2, 3]) // => [1, 2]
_.dropRight([1, 2, 3], 2) // => [1]
_.dropRight([1, 2, 3], 5) // => []
_.dropRight([1, 2, 3], 0) // => [1, 2, 3]
-
.dropRightWhile(array, [predicate=.identity])
创建一个切片数组,去除array中从 predicate 返回假值开始到尾部的部分。predicate 会传入3个参数: (value, index, 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(array, value, [start=0], [end=array.length])
使用 value 值来填充(替换) array,从start位置开始, 到end位置结束(但不包含end位置)。
var array = [1, 2, 3];
_.fill(array, 'a') // => ['a', 'a', 'a']
_.fill(Array(3), 2) // => [2, 2, 2]
_.fill([4, 6, 8, 10], '*', 1, 3) // => [4, '*', '*', 10]
- .findIndex(array, [predicate=.identity], [fromIndex=0])
该方法类似_.find,区别是该方法返回第一个通过 predicate 判断为真值的元素的索引值(index),而不是元素本身。
var users = [
{ 'user': 'barney', 'active': false },
{ 'user': 'fred', 'active': false },
{ 'user': 'pebbles', 'active': true }
];
_.findIndex(users, function(o) { return o.user == 'barney'; }) // => 0
_.findIndex(users, { 'user': 'fred', 'active': false }) // => 1
_.findIndex(users, ['active', false]) // => 0
_.findIndex(users, 'active') // => 2
- .findLastIndex(array, [predicate=.identity], [fromIndex=array.length-1])
这个方式类似_.findIndex, 区别是它是从右到左的迭代集合array中的元素。
var users = [
{ 'user': 'barney', 'active': true },
{ 'user': 'fred', 'active': false },
{ 'user': 'pebbles', 'active': false }
];
_.findLastIndex(users, function(o) { return o.user == 'pebbles'; }) // => 2
_.findLastIndex(users, { 'user': 'barney', 'active': true }) // => 0
_.findLastIndex(users, ['active', false]) // => 2
_.findLastIndex(users, 'active') // => 0
- _.head(array)
获取数组 array 的第一个元素。
_.head([1, 2, 3]) // => 1
_.head([]) // => undefined
- _.flatten(array)
减少一级array嵌套深度。
_.flatten([1, [2, [3, [4]], 5]]) // => [1, 2, [3, [4]], 5]
- _.flattenDeep(array)
将array递归为一维数组。
_.flattenDeep([1, [2, [3, [4]], 5]]) // => [1, 2, 3, 4, 5]
- _.flattenDeep(array)
根据 depth 递归减少 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(pairs)
与_.toPairs正好相反;这个方法返回一个由键值对pairs构成的对象。
_.fromPairs([['fred', 30], ['barney', 40]]) // => { 'fred': 30, 'barney': 40
- _.indexOf(array, value, [fromIndex=0])
使用SameValueZero 等值比较,返回首次 value 在数组array中被找到的 索引值, 如果 fromIndex 为负值,将从数组array尾端索引进行匹配。
_.indexOf([1, 2, 1, 2], 2) // => 1
_.indexOf([1, 2, 1, 2], 2, 2) // => 3
- _.initial(array)
获取数组array中除了最后一个元素之外的所有元素(注:去除数组array中的最后一个元素)。
_.initial([1, 2, 3]) // => [1, 2]
- _.intersection([arrays])
获取数组array中除了最后一个元素之外的所有元素(注:去除数组array中的最后一个元素)。
_.initial([1, 2, 3]) // => [1, 2]
- .intersectionBy([arrays], [iteratee=.identity])
这个方法类似_.intersection,区别是它接受一个 iteratee 调用每一个arrays的每个值以产生一个值,通过产生的值进行了比较。结果值是从第一数组中选择。iteratee 会传入一个参数:(value)。
_.intersectionBy([2.1, 1.2], [4.3, 2.4], Math.floor) // => [2.1]
_.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x') // => [{ 'x': 1 }]
- _.intersectionWith([arrays], [comparator])
这个方法类似_.intersection,区别是它接受一个 comparator 调用比较arrays中的元素。结果值是从第一数组中选择。comparator 会传入两个参数:(arrVal, othVal)。
var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]
_.intersectionWith(objects, others, _.isEqual) // => [{ 'x': 1, 'y': 2 }]
- _.join(array, [separator=','])
将 array 中的所有元素转换为由 separator 分隔的字符串。
_.join(['a', 'b', 'c'], '~') // => 'a~b~c'
- _.last(array)
获取array中的最后一个元素。
_.last([1, 2, 3]) // => 3
- _.lastIndexOf(array, value, [fromIndex=array.length-1])
这个方法类似_.indexOf ,区别是它是从右到左遍历array的元素。
_.lastIndexOf([1, 2, 1, 2], 2) // => 3
_.lastIndexOf([1, 2, 1, 2], 2, 2) // => 1
- _.pull(array, [values])
移除数组array中所有和给定值相等的元素,使用 SameValueZero 进行全等比较。
var array = [1, 2, 3, 1, 2, 3];
_.pull(array, 2, 3);
console.log(array);
// => [1, 1]
- _.nth(array, [n=0])
获取array数组的第n个元素。如果n为负数,则返回从数组结尾开始的第n个元素。
var array = ['a', 'b', 'c', 'd'];
_.nth(array, 1);
// => 'b'
_.nth(array, -2);
// => 'c';
- _.pullAll(array, values)
这个方法类似_.pull,区别是这个方法接收一个要移除值的数组。
var array = [1, 2, 3, 1, 2, 3];
_.pullAll(array, [2, 3]);
console.log(array);
// => [1, 1]
- .pullAllBy(array, values, [iteratee=.identity])
这个方法类似于_.pullAll ,区别是这个方法接受一个 iteratee(迭代函数) 调用 array 和 values的每个值以产生一个值,通过产生的值进行了比较。iteratee 会传入一个参数: (value)。
var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
_.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
console.log(array);
// => [{ 'x': 2 }]
- _.pullAllWith(array, values, [comparator])
这个方法类似于_.pullAll,区别是这个方法接受 comparator 调用array中的元素和values比较。comparator 会传入两个参数:(arrVal, othVal)。
var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
_.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);
console.log(array);
// => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
- _.pullAllWith(array, values, [comparator])
这个方法类似于_.pullAll,区别是这个方法接受 comparator 调用array中的元素和values比较。comparator 会传入两个参数:(arrVal, othVal)。
var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
_.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);
console.log(array);
// => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
- _.pullAt(array, [indexes])
根据索引 indexes,移除array中对应的元素,并返回被移除元素的数组。
var array = [5, 10, 15, 20];
var evens = _.pullAt(array, 1, 3);
console.log(array);
// => [5, 15]
console.log(evens);
// => [10, 20]
- .remove(array, [predicate=.identity])
移除数组中predicate(断言)返回为真值的所有元素,并返回移除元素组成的数组。predicate(断言) 会传入3个参数: (value, index, array)。
var array = [5, 10, 15, 20];
var evens = _.pullAt(array, 1, 3);
console.log(array);
// => [5, 15]
console.log(evens);
// => [10, 20]
- .remove(array, [predicate=.identity])
反转array,使得第一个元素变为最后一个元素,第二个元素变为倒数第二个元素,依次类推。
var array = [1, 2, 3];
_.reverse(array);
// => [3, 2, 1]
console.log(array);
// => [3, 2, 1]
- _.slice(array, [start=0], [end=array.length])
裁剪数组array,从 start 位置开始到end结束,但不包括 end 本身的位置。
var array = [1, 2, 3];
_.slice(array,1,2);
// => [ 2]
console.log(array);
// => [3, 2, 1]
- .sortedIndexBy(array, value, [iteratee=.identity])
这个方法类似_.sortedIndex ,除了它接受一个 iteratee (迭代函数),调用每一个数组(array)元素,返回结果和value 值比较来计算排序。iteratee 会传入一个参数:(value)。
var array = [1, 2, 3];
_.reverse(array);
// => [3, 2, 1]
console.log(array);
// => [3, 2, 1]