偶然看到项目中用的reduce,很少使用,就百度看了些实例,发现这玩意很有意思,特别是看到一个实现groupBy的实现方法,就做了个与for寻源的性能对比(主要是像记录一下,记性太差了)
测试环境: node
使用for循环 reduce对比贴代码
数据量: 5000 50000 500000 5000000
function groupByR(array, name){
return array.reduce((acc, cur) => {
let o = cur[name]
acc[o] = acc[o] || []
acc[o].push(cur)
return acc
}, {})
}
function groupByF( array , id ) {
let groups = {};
for( var i=0; i<array.length; i++ ){
let group = array[i][id];
groups[group] = groups[group] || [];
groups[group].push( array[i] );
}
return Object.values(groups);
}
for(var i=0; i<5000000; i++){
if (i%2) {
listFor.push({"name": "小张","Average":15,"High":10,"DtmStamp":1358226000000})
} else if ( i%3 ) {
listFor.push({"name": "小红","Average":16,"High":92,"DtmStamp":1358226000000},)
} else if( i%4 ) {
listFor.push({"name": "小李","Average":16,"High":92,"DtmStamp":1358226000000},)
} else if( i%5 ) {
listFor.push({"name": "小芳","Average":16,"High":92,"DtmStamp":1358226000000},)
} else if( i%6 ) {
listFor.push({"name": "小田","Average":16,"High":92,"DtmStamp":1358226000000},)
} else if( i%7 ) {
listFor.push({"name": "小赵","Average":16,"High":92,"DtmStamp":1358226000000},)
} else if( i%8 ) {
listFor.push({"name": "小天","Average":16,"High":92,"DtmStamp":1358226000000},)
} else if( i%9 ) {
listFor.push({"name": "小许","Average":16,"High":92,"DtmStamp":1358226000000},)
} else if( i%10 ) {
listFor.push({"name": "小刘","Average":16,"High":92,"DtmStamp":1358226000000},)
}
}
console.time('reduce分组')
let groupR = Object.values( groupByR(listFor, 'name'))
console.timeEnd('reduce分组', groupR)
console.log(groupR)
这里reduce:
5000:
50000:
500000:
5000000:
这里 for的结果
5000:
50000:
500000:
5000000:
两种对比五百万条数据的情况下分别做了5次测试,取平均值
reduce: 446.833
for: 382.0286
大数据量的情况下依然时for循环完胜,但是reduce胜在写法简便,不用额外定义太多属性就能完成简单的数据分组。
文章简陋有错误求指正,仅作为记录文章。