(转载请注明出处)

听说lodash在javascript领域无人不知,但看了看她的文档,就这么几个功能,哥表示不服,决定找她说道说道。

你哥:你就是lodash?

lodash:

你哥:我是你哥,看你在Github上有13000+颗星?

lodash:(害羞脸)对呀~

你哥:
不服

lodash:恩?

你哥:你TMD还敢在本屌面前一直吹嘘自己器大(功能全)活好(高性能),擦擦

lodash:恩恩?

你哥:啥也别说了,let us 比划比划!

lodash:……

_.chunk

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

你哥:这就是你文档中的第一个函数?说,用来干嘛的!

lodash:官方是这么说的,

Creates an array of elements split into groups the length of size. If array can’t be split evenly, the final chunk will be the remaining elements.

简单说,就是你传给它一个数组,和你希望拆分后每个数组的长度size,然后它返回给你拆分后的结果。需要注意的是,如果传入数组的长度不是size的整数倍,最后一部分的元素个数可能小于size

例子:

1
2
3
4
5
6
7
_.chunk(['a', 'b', 'c', 'd'], 2);
// → [['a', 'b'], ['c', 'd']]
// 数组长度正好为4,被拆为两部分(4 / 2 = 2)

_.chunk(['a', 'b', 'c', 'd'], 3);
// → [['a', 'b', 'c'], ['d']]
// 数组长度不是3的整数倍,所以最后一部分只有一个元素(4 % 3 = 1)

你哥:(心中窃喜,运气真好,来就碰到个软柿子)擦,就这种功能而已?

小样儿

你哥:来来来,哥分分钟给你撸一个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function chunk(array, size) {
size = typeof size === 'number' && size > 0 ? size : 0;
var length = array.length;

if (size === 0 || length === 0) {
return [];
}

var i = 0,
j = -1,
result = [];

for (; i < length; i++) {
if (i % size === 0) {
j++;
result[j] = [array[i]];
} else {
result[j].push(array[i]);
}
}

return result;
}

你哥:看见没,哥也是有实力的人,运行一下例子

1
2
3
4
5
nigede.chunk(['a', 'b', 'c', 'd'], 2);
// → [['a', 'b'], ['c', 'd']]

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

你哥:啥都不说了,完美!

完美

你哥:你就说服不服

lodash:

1
2
3
4
5
6
7
_.chunk(['a', 'b', 'c', 'd'], -1);
// → []
// 应该正确应对负数,若为负数则返回空数组

_.chunk(['a', 'b', 'c', 'd'], 1.5);
// → [['a'], ['b'], ['c'], ['d']]
// 应该正确应对小数,将其向下取整为整数,1.5向下取整为1

你哥:你这什么意思?不说话就扔两段代码,瞧不起人是不是?不就是边界检查吗,你以为哥不懂么

1
2
nigede.chunk(['a', 'b', 'c', 'd'], -1);
// → []

你哥:
我真不愧是天才

你哥:继续

1
2
nigede.chunk(['a', 'b', 'c', 'd'], 1.5);
// → [['a', 'b', 'c'], ['d']]

你哥:What?(突然想起确实忘了小数这一茬了,但并不能承认)这一定是打开的方式不对,容我再换个姿势运行一遍……

lodash:

1
2
3
_.chunk();
// → []
// 考虑第一个参数为undefined或非数组的情况,此时应返回空数组

你哥:

1
2
nigede.chunk();
// → TypeError: Cannot read property 'length' of undefined

你哥:天了噜,什么鬼!不是说好了第一个参数是数组吗……
(急速思考如何需要寻求转机,突然计上心头)
咱都是爷们,能不能别老玩这种小伎俩,有种来硬货,比比速度,敢么?

lodash:哦(人家明明是萌妹子)

你哥:先给你看看哥的

1
2
3
nigede.chunk mini array 10000000 times: 1948.027ms
nigede.chunk huge array of 10000000 elements: 598.472ms
nigede.chunk huge array of 10000000 elements 10 times: 6688.377ms

哈哈哈,看这飞一般的速度,你要是怕了,现在投降哥也是接受的

lodash:哇,真的好厉害,我也想试试呢

1
_.chunk mini array 10000000 times: 1267.384ms

你哥:。。。

lodash:好有意思,再来一个

1
_.chunk huge array of 10000000 elements: 328.834ms

你哥:。。。。。。

lodash:运气好而已啦,说不定最后一个就是你更快啦

1
_.chunk huge array of 10000000 elements 10 times: 3598.423ms

你哥:。。。。。。。。。
你TM在逗我吗

你哥:好了,那谁,lodash,你妈喊你回去吃饭了,今天咱俩算平手,明天再分高下。

lodash:恩,今天好开心,明天见^_^