Lodash Collection集合
Collection是集合的意思,什么是集合?
数组绝对是一个集合,
一些有序的对象也是一些集合,
从页面中获取到的一些DOM对象也是集合,DOM对象叫HTMLCollection是一个对象,
HTMLCollection
https://blog.csdn.net/lncci/article/details/81096371
一、按规则统计
1、按照一定规则统计数量
_.countBy()
按照一定规则统计数量,
key循环次数,value为匹配到的数量,
返回一个集合对象
console.log( _.countBy(['one', 'two', 'three'], 'length') ); // {3: 2, 5: 1}
按数组中每一个数据的length进行统计,length为3的有两个数据一组,length为5的有1个数据一组,length是迭代函数(iteratee)
迭代参数使用 Math.floor 向下取整做
_.countBy([6.1, 4.2, 6.3], Math.floor); // { '4': 1, '6': 2 }
2、按照一定规则进行分组
_.groupBy()
按照一定规则进行分组,key为循环次数,value为匹配到的数组
console.log(_.groupBy(['one', 'two', 'three'], 'length')); // {3:['one', 'two'], 5:['three']}
迭代参数使用 Math.floor 向下取整做
console.log(_.groupBy([6.1, 4.2, 6.3], Math.floor)); // { '4': [4.2], '6': [6.1, 6.3] }
总结:
两个方法差不多,返回的都是对象,key都是一样的数字,区别在于value值不同
grounpBy: value是统计的是数据的次数
countBy: value是统计到的数据都有哪些
其它
each()/forEach() 循环,与原生Array.forEach一样
eachRight()/forEachRight() 倒着循环
every() 与原生Array.every方法一样
filter() 滤数组,与Array对象上的filter()方法一样
find() 查找数据,与Array对象上的find()方法一样(找索引)
findLast() 与上面一样,区别在于它是从右往左查(倒着找索引)
flatMap() 生成一个扁平化的数组,与原生的flatMap()方法一样
flatMapDeep() 与上面一样,不过它可以递归(递归往深了找)
flatMapDepth() 与上面一样,它可以递归,并且可以指定递归的深度(Depth是递归的次数,想递归几层就几层)
_.includes() 与Array对象上的includes()方法一样
二、第二个参数处理数组
_.invokeMap()
使用第二个参数(方法)去处理第一个参数,返回处理后的结果(数组)
1、sort数组排序
console.log(_.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort')); // [ ['1', '5', '7'], ['1', '2', '3']]
2、split字符串拆分成数组
split字符串拆分成数组,返回的是二维数组(String对象的原型prototype上的split方法)
console.log(_.invokeMap([123, 456], String.prototype.split, '')); // [['1', '2', '3'], ['4', '5', '6']]
第三个参数做为一个值,丢给第二个参数(方法)作为参数,去处理第一个参数,比如用横线拆分数组
console.log(_.invokeMap(['1-3', '4-6'], String.prototype.split, '-')); // [['1', '3'], ['4', '6']]
三、创建一个对象
_.keyBy()
创建一个对象,里面的key由第二个参数决定,value为原数组中对应的那条数据
var array = [ { 'dir': 'left', 'code': 97 }, { 'dir': 'right', 'code': 100 } ]; var result = _.keyBy(array, function (o){ return String.fromCharCode(o.code); // key是使用fromCharCode解析后的字符。value为它所在数组里的那条数据 }); console.log(result); // { a: {dir: 'left', code: 97}, d: {dir: 'right', code: 100} }
1). 第二个参数是迭代器方法,参数是一个o,意思是会把array数组中每一个数据丢到方法中迭代
2). 方法内是字符串方法String.fromCodePoint,把每个o.code的值是数字,把数字解析成字符
3). 97解析为a,key是a,value为所对应的数据,后面同理...
key为dir属性的值,value为key所在的那条数据
console.log(_.keyBy(array, 'dir')); // { left: {dir: 'left', code: 97}, right: {dir: 'right', code: 100} }
Unicode转码知识点
fromCharCode、fromCodePoint 负责将 ascii 码对应的数字转为 对应的字符
console.log(String.fromCharCode(97)); // a console.log(String.fromCodePoint (97)); // a
charCodeAt、codePointAt 负责将 对应的字符 转为对应的数字 ascii 码值
console.log('a'.charCodeAt(0)); // 97 // console.log('a'.codePointAt(0)); //
https://blog.csdn.net/gulang03/article/details/89390784
其它
map(collection, [iteratee=_.identity]) 原生数组有这个方法
四、排序
1、既能升序又能降序
_.orderBy()
以age属性的值进行升序排序
var users = [ { 'user': 'fred', 'age': 48 }, { 'user': 'barney', 'age': 34 }, { 'user': 'fred', 'age': 40 }, { 'user': 'barney', 'age': 36 } ]; console.log( _.orderBy(users, 'age', 'asc') ); /* [ {user: 'barney', age: 34}, {user: 'barney', age: 36}, {user: 'fred', age: 40}, {user: 'fred', age: 48} ] */
以user属性的值进行降序排序(按字母的Unicode码大小来排序)
var users = [ { 'user': 'a', 'age': 48 }, { 'user': 'fred', 'age': 48 }, { 'user': 'barney', 'age': 34 }, { 'user': 'fred', 'age': 40 }, { 'user': 'barney', 'age': 36 }, { 'user': 'z', 'age': 48 }, ]; console.log(_.orderBy(users, 'user', 'desc')); /* [ {user: 'z', age: 48}, {user: 'fred', age: 48}, {user: 'fred', age: 40}, {user: 'barney', age: 34}, {user: 'barney', age: 36}, {user: 'a', age: 48} ] */
asc 升序 1, 2, 3
desc 降序 3, 2, 1
2、只能升序
_.sortBy()
只能升序。字母按Unicode码大小来排序
var users = [ { 'user': 'fred', 'age': 48 }, { 'user': 'barney', 'age': 34 }, { 'user': 'fred', 'age': 40 }, { 'user': 'barney', 'age': 36 } ]; var result = _.sortBy(users, function (o) { return o.age; }); console.log(result); /* {user: 'barney', age: 34} {user: 'barney', age: 36} {user: 'fred', age: 40} {user: 'fred', age: 48} */
以age是数字,按照数字的升序排
console.log( _.sortBy(users, function (o) { return o.age; }) ); /* [ {user: "barney", age: 34}, {user: "barney", age: 36}, {user: "fred", age: 40}, {user: "fred", age: 48} ] */
五、拆分数组
_.partition()
根据第2个参数把一个数组分拆成一个二维数组
var users = [ { 'user': 'barney', 'age': 36, 'active': false }, { 'user': 'fred', 'age': 40, 'active': true }, { 'user': 'pebbles', 'age': 1, 'active': false } ]; console.log( _.partition(users, function(o){ return o.active; // active为true的放在一起,active为false的放在一起 }) ); /* [ [ {user: "fred", age: 40, active: true} ], [ {user: "barney", age: 36, active: false}, {user: "pebbles", age: 1, active: false} ] ] */
active值为true的放一组,另外的active放一组
在原数据users里进行查找,以第二个参数是一个对象,以这个对象为准进行拆分。把第二个参数对应的数据放一起,其余的放一起
console.log(_.partition(users, {'age':1, 'active':false})); /* [ [ {user: "pebbles", age: 1, active: false ], [ {user: "barney", age: 36, active: false}, {user: "fred", age: 40, active: true} ] ] */
其它
_.reduce() 与Array对象上的reduce()方法一样
_.reduceRight() 与Array对象上的reduceRight()方法一样
六、过滤
_. filter()
过滤数组,与Array对象上的filter()方法一样
var users = [ { 'user': 'barney', 'age': 36, 'active': true }, { 'user': 'fred', 'age': 40, 'active': false } ]; console.log( _.filter(users, function(o) { return !o.active; }) ); // [{ 'user': 'fred', 'age': 40, 'active': false }]
_.reject()
reject与filter相反,filter把条件为真的过滤出来,reject方法把的return false返回来
var users = [ { 'user': 'barney', 'age': 36, 'active': false }, { 'user': 'fred', 'age': 40, 'active': true } ]; console.log( _.reject(users, function (o) { return o.active; }) ); // [{user: 'barney', age: 36, active: false}]
第二个参数的形式是对象,符合条件被过滤掉,不符合条件的挑出来
console.log(_.reject(users, { 'age': 36, 'active': false })); // [{'user': 'fred', 'age': 40, 'active': true}]
第二个参数是数组的形式,在users里找key是user,value是fred,有这对键值的过滤掉了
console.log(_.reject(users, ['user', 'fred']) ); // [{'user': 'barney', 'age': 36, 'active': false}]
第二个参数是字符串,都有'age'属性的全部过滤掉,返回一个空数组
console.log(_.reject(users, 'age'));// []
总结:
符号第二个参的都过滤掉,返回与第二个参数不符合的剩余部分
七、随机(很有用)
1、随机数
_.sample(Array/object)
从数组中随机取一个数据
console.log(_.sample(['a', 'b', 'c', 'd', 'e'])); // 从数组中随机取一个数据
_.sampleSize(Array/object, number)
获得 n 个随机数据
console.log(_.sampleSize(['a', 'b', 'c', 'd', 'e'], 3)); // 第二个参数获得n个随机数据
2、随机排序(项目中经常会用到)
_.shuffle(Array/object)
随机排序
console.log(_.shuffle(['a', 'b', 'c', 'd', 'e'])); // 随机排序[比较重要的],每次顺序都不一样
八、集合长度
_.size(Array/object)
返回集合长度
console.log( _.size(['a', 'b', 'c', 'd', 'e']), // 返回数组的长度 5 _.size({ a: 1, b: 2 }), // 返回对象可枚举的数量 2 _.size('ruyiCao'), // 7 _.size('远远的地方'), // 5 );
其它
some() 与Array对象上的some()方法一样
附
Truthy、Falsy与true、false的区别
https://blog.csdn.net/namechenfl/article/details/83987098
俗话说冬至在月尾,烤火到小满,意思是说去年的冬至如果是在月尾,那么一直会到第二年的小满,天气才会暖和起来。