Go to comments

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


俗话说冬至在月尾,烤火到小满,意思是说去年的冬至如果是在月尾,那么一直会到第二年的小满,天气才会暖和起来。



Leave a comment 0 Comments.

Leave a Reply

换一张