Go to comments

Lodash Array数组方法

Lodash扩展了JavaScript内置对象方法的工具库,

它对 Array、Function、Oject、String、Number、Math 等等内置对象进行很丰富的扩展,添加了以及重置了很多很多方法,这些方法能帮我们快速的解决一些重复的、复杂的问题,就是帮助我们的工作的。


Lodash和jQuery一样封装了一个全局的对象,jQuery全局对象是$符号,Lodash全局对象是 _ 下划线


官网

英文 https://lodash.com/

中文 lodashjs.com


CDN

https://www.jsdelivr.com/package/npm/lodash

<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>

https://www.bootcdn.cn/lodash.js/

<script src="https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>


一、拆分组合

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

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

_.chunk(['a', 'b', 'c', 'd'], 2); // [['a', 'b'], ['c', 'd' ]]

_.chunk(['a', 'b', 'c', 'd'], 3); // [['a', 'b', 'c'], [ 'd' ]]


_.concat()

作用:合并数组,与Array对象的方法一样

返回:连接后的新数组


三、过滤

_.compact() 

过滤掉原数组里的非真(转布尔值后为false)数据,

例如 false,  null,  0,  "",  undefined,  NaN  都是被认为是假值(compact,n是协议契约合约,adj紧凑的意思)

_.compact([0, 1, false, 2, '', 3, null, NaN, undefined]); // [1, 2, 3]


_.difference(array, [values])

去除不同的数据,

例如干掉第一个数组中,和第二个数组重复的数据

_.difference([1, 3, 5, 7, 9], [3, 7]); // [1, 5, 9]


By 接收一个迭代器参数,这个迭代器参数会把每一个数据都进行遍历,按照迭代器的功能处理


_.differenceBy()

跟上面 difference 是一样的,只不过再接收一个参数(迭代器参数)

var arrFirst = [3.1, 2.2, 1.3];
var arrSecond = [4.4, 2.5];

_.differenceBy(arrFirst, arrSecond, Math.floor); // [3.1, 1.3]


Math.floor向下取整

1. 把所有的数据都迭代一次,向下取整  [3, 2, 1],  [4, 2] 

2. 取整后再去做 difference 的事件干掉2  [3, 1]

3. 返回的数据还是原来的数据 [3.1, 1.3]


With 也是接收一个参数,但是不是迭代器是一个比较器。意思是把一个参数的数据,都跟第二个参数进行对比


_.differenceWith()

与上面的方法一样,只不过它可以接收一个比较器的函数做为参数,对每个数据都要比较一下

var objects = [{'x':1, 'y':2}, {'x':2, 'y':1}];

_.differenceWith(objects, [{'x':1, 'y':2}], _.isEqual); // [{x: 2, y: 1}]


_.isEqual方法用来比较两个数据是否相等,也是lodash中的一个方法

1. {'x':1, 'y':2} 跟 objects[0] 比,数据相等,把 objects[0] 干掉

2 .{'x':1, 'y':2} 跟 objects[1] 比,数据不一样,objects[1] 留下来

3. 返回过滤后的新数组 [{x: 2, y: 1}]


Ps:isEqual是比较相等,还可以比较大于、小于…


四、切割提取

1、切割

_.drop()

切掉数组的前n(第二个参数,默认为1)位

console.log(_.drop(['a', 'b', 'c', 'd', 'e'], 2)); // ['c', 'd', 'e']


Right 默认是切前2个,reght是切后面两个


_.dropRight()

切掉数组的后n位

console.log( _.dropRight( ['a', 'b', 'c', 'd', 'e'], 2 )); // ['a', 'b', 'c']


_.dropWhile()

去掉数组中,从起点到第二个方法返回假的数据。与Array对象身上的filter()方法一样

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

console.log( _.dropWhile(users, function(o) { return !o.active; }) ); // [{user: 'pebbles', active: true}]

函数function(o) { return !o.active; }会在每一次遍历调用

1). 形参o,表示把每一条数据传进来,

     return !o.active 表示把acive的布尔值取反

2). 从起始点开始 到 function(o)方法返回一个假false的数据为止,

     返回第三条数据{ 'user': 'pebbles', 'active': true } ,因为active:true取反变成active:false

3). 把假前面两条active为真数据干掉,最后结果仅仅剩第三条{ 'user': 'pebbles', 'active': true } 一条数据

总结,这个迭代器就是遇到假的,就把假的返回


_.dropRightWhile()

与上面一样,不过它是从右边开始查,查到返回假的那个数据都去除

2、提取

_.take()

提取数组的前n(第二个参数,默认为1)位。与drop方法相反

var arr = ['a', 'b', 'c', 'd', 'e'];

console.log(_.take(arr, 2 )); // ['a', 'b']

console.log(_.drop(arr, 2 )); //  ["c", "d", "e"]

console.log(arr); // ['a', 'b', 'c', 'd', 'e']

和drop方法是相反的,drop是删除掉前n位,take是提取前n位。不影响原数组


_.takeRight()

_.takeRightWhile()

_.takeWhile()

五、填充

_.fill() 

填充数组,与Array对象身上的fill()方法一样

六、查找

_.findIndex()  

原生数组对象有这个方法一模一样的,查满足条件的数据对应的索引值


_.findLastIndex() 

从后往前找,与findIndex是相反的

七、降维

_.flatten() 

减少一级数组嵌套深度,与Array的flat()这个方法相似

console.log( _.flatten( ['a', ['b', ['c', ['d']]]] ) ); // ['a', 'b', ['c', ['d']]]


_.flattenDeep()

把数组递归为一维数组。相当于[].flat(Infinity)

console.log( _.flattenDeep( ['a', ['b', ['c', ['d']]]] ) ); // ['a', 'b', 'c', 'd']

// 相当于
// console.log( ['a', ['b', ['c', ['d']]]].flat(Infinity) ); // ['a', 'b', 'c', 'd']


_.flattenDepth(array, n) 

减少n(第二个参数)层数组的嵌套。相当于[].flat(2)

console.log( _.flattenDepth( ['a', ['b', ['c', ['d']]]], 2) ); // ['a', 'b', 'c', ['d']]

减少3层

console.log( _.flattenDepth( ['a', ['b', ['c', ['d']]]], 3) ); //  ['a', 'b', 'c', 'd']


JS数组扁平化(flat)方法总结详解

https://www.jb51.net/article/163767.htm

七、转对象

fromPairs() 

把数组转换为一个对象,与Object.fromEntries()方法一样

八、获取

1、获取第一位/最后一位

_.head()

head()/first()获取数组里第一个元素,就是取下标为0的那个数据

console.log( _.head([1, 2, 3]) ); // 1

console.log( _.head([]) ); // undefined


_.first()

取数组里的最后一位数据,取下标为length-1的那个数据

console.log( _.first([1, 2, 3]) ); // 1


_.last()

取数组里的最后一位数据,相当于用原生JS取下标为length-1的那个数据

console.log( _.last([1, 2, 3]) ); // 3

2、找索引值

_.indexOf()

查找数据,并返回数据对应的索引值,与Array对象身上的indexOf()方法一样

console.log( _.indexOf( ['a', 'b', 'c', 'd'], 'c') ); // 返回数据c索引值 2

console.log( _.indexOf( ['a', 'b', 'c', 'd'], 3) ); // 没找到返回 -1


lastIndexOf()

查找数据,并返回数据对应的索引值,与Array对象身上的lastIndexOf()方法一样

3、获取除第一位剩下的部分/最后一位剩下的部分

_.initial()

获取数组除了最后一位的所有数据

console.log( _.initial([1, 2, 3]) ); // [1, 2]

相当于删除数组里的最后一个数据,与Array对象身上的pop()方法一样,区别在于pop方法会改变原数组,而这个方法不会改变原数组


_.tail()

获取除了数组第一个元素以外的全部元素,想当于Array对象身上的shift(),与initial()相反

console.log( _.tail([1, 2, 3]) ); // [2, 3]

4、获取交集

_.intersection()

取数组的交集

console.log(_.intersection(['a', 'b'], ['b', 'c'], ['e', 'b'])); // ['b']


_.intersectionBy()

By形式接收一个遍历器(iteratee)

console.log(_.intersectionWith([2.1, 1.2], [4.3, 2.4], Math.floor)); // [2.1]


_.intersectionWith()

接收一个_.isEqual比较器

var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];

var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];

console.log( _.intersectionWith(objects, others, _.isEqual) ); // [{ 'x': 1, 'y': 2 }]

5、获取并集

_.union()

取数组的并集(把数据全部合并起来,然后去掉重复的)

console.log(_.union([2], [1, 2])); // [2, 1]


_.unionBy()

console.log( _.unionBy([2.1], [1.2, 2.3], Math.floor) ); // [2.1, 1.2]


_.nuionWith()

6、删除交集

_.xor()

删除数组的交集,留下非交集的部分(intersection是取交集的部分,xor是取非交集的部分)

console.log(_.xor(['a', 'b'], ['b', 'c'], ['e', 'b'])); // ["a", "c", "e"]


_.xorBy()

_.xorWith()

6、获取数组中某一个数据

_.nth()

取数组里的某个数据,就是通过下标取到某个数据。只不过它的数字(下标)可以为负。表示倒着找

var array = ['a', 'b', 'c', 'd'];

console.log(
	_.nth(array, 1),	//b
	_.nth(array, -2),	//c
);

十、转字符串

_.join()

把数组转成字符串,原生的Array对象也有这个方法

十一、删除

_.pull()

根据给的参数(参数为数据)删除原数组里的对应数据

返回原生数组

var array = [1, 2, 3, 1, 2, 3];

_.pull(array, 2, 3); // [1, 1]

console.log(array); // [1, 1]

删除掉2和3,数组里就剩下 1


_.pullAll()

与上面的方法一样,就是参数为数组(好比call, apply这两个方法的区别)

var array = [1, 2, 3, 1, 2, 3];

_.pullAll(array, [2, 3])

console.log(array); // [1, 1]

pull和pullAll 和 call, apply这两个方法比较像


_.pullAllBy()

_.pullAllWith()


_.pullAt()

根据给的参数(参数为索引)删除原数组里的对应的数据

var array = [5, 10, 15, 20];

var evens = _.pullAt(array, 1, 3);

console.log('原数组变成:' + array); // [5, 15]

console.log('返回的数组:' + evens); // [10, 20]


总结

pull、pullAll  参数是要删除的数据

pullAt            参数是要删除的索引


_.remove()

根据函数删除原数组里的数据(pull系列那些方法都通过rmove来实现)

var arr = ['a', 'b', 'c', 'd', 'e'];

// 参数是forEach、map..方法的形式
// 删除索引值大于2的位
_.remove(arr, function (value, index, array) {
	return index > 2;
});

console.log('原数组:' + arr); // ["a", "b", "c"]


_.without()

根据我们给的参数(参数为数据)删除原数组里的对应数据,与_.remove区别是不改变原数组

var arr = ['a', 'b', 'c', 'd', 'e'];

console.log(_.without(arr, 'b', 'c')); // ['a', 'd', 'e']

console.log(arr); // ["a", "b", "c", "d", "e"]

十二、颠倒

_.reverse()

颠倒数组,比原生原生Array对象的方法好用

var arr = [10, 2, 3, 0.5, 1.2];

console.log( _.reverse(arr) ); // [1.2, 0.5, 3, 2, 10]

十三、截取

_.slice()

截取数组,这个方法原生的Array对象也有

从start开始到end结束,不包括end本身的位置

十四、排序

不是我们想的那种排序,是往数组里插入一些数据进行排序,意义不大

_.sortedIndex

_.sortedIndexBy

_.sortedIndexOf

_.sortedLastIndex

_.sortedLastIndexBy

_.sortedLastIndexOf

_.sortedUniq

_.sortedUniqBy

十五、去重

_.uniq()

console.log(_.uniq([1, 2, 2, 1])); // [1, 2]


uniqBy()/uniqWith() 与前面的一样

十六、zip

_.zip()

把各数组中索引值相同的数据放到一起,组成一个新的二维数组

var arr1 = ['小明', '小红', '小刚'];
var arr2 = ['男', '女', '男'];
var arr3 = [12, 13, 14];

console.log(_.zip(arr1, arr2, arr3)); // [ ["小明", "男", 12], ["小红", "女", 13], ["小刚", "男", 14] ]


_.zipObject()

与zip方法一样,区别是它输出的是对象,对象的形式是key: value,所以最后一组数据不能加了

var arr1 = ['小明', '小红', '小刚'];
var arr2 = ['男', '女', '男'];
var arr3 = [12, 13, 14];

console.log(_.zipObject(arr1, arr2, arr3)); // {小明: "男", 小红: "女", 小刚: "男"}


_.zipObjecDeep() 有一些严格,我们用不到


_.zipWith()

with结尾跟之前稍微有一些不同,也是遍历每个数据,但是这里是索引相同的数据进行累加

var serult = _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {
  return a + b + c;
});

console.log(serult); // [111, 222]


_.unzip()

这个方法与zip相反,把每个数组里索引值一样的数据放在一起

console.log(_.unzip([["小明", "男", 12],["小红", "女", 13],["小刚", "男", 14]]));

// [['小明', '小红', '小刚'], ['男', '女', '男'], [12, 13, 14]]


unzipWith()与zipWidth()跟之前一样,接收了一个迭代器的函数




Leave a comment 0 Comments.

Leave a Reply

换一张