摘要:最近工作中需要写一些运营数据报表的页面,后端返回的数据都是未处理过的,所以,大量的运算任务交给了前端来做,这其中有一个功能就是对数据进行分组,一开始我自己也尝试写了一些,但代码量比较大,显得很繁琐,直到后来在上看到了某位大牛写的方法,非常简
最近工作中需要写一些运营数据报表的页面,后端返回的数据都是未处理过的json,所以,大量的运算任务交给了前端来做,这其中有一个功能就是对数据进行分组,一开始我自己也尝试写了一些,但代码量比较大,显得很繁琐,直到后来在stackoverflow上看到了某位大牛写的方法,非常简洁优雅,代码如下:
function groupBy( array , f ) { let groups = {}; array.forEach( function( o ) { let group = JSON.stringify( f(o) ); groups[group] = groups[group] || []; groups[group].push( o ); }); return Object.keys(groups).map( function( group ) { return groups[group]; }); } let list = [ {"name": "John","Average":15,"High":10,"DtmStamp":1358226000000}, {"name": "Jane","Average":16,"High":92,"DtmStamp":1358226000000}, {"name": "Jane","Average":17,"High":45,"DtmStamp":1358226000000}, {"name": "John","Average":18,"High":87,"DtmStamp":1358226000000}, {"name": "Jane","Average":15,"High":10,"DtmStamp":1358226060000}, {"name": "John","Average":16,"High":87,"DtmStamp":1358226060000}, {"name": "John","Average":17,"High":45,"DtmStamp":1358226060000}, {"name": "Jane","Average":18,"High":92,"DtmStamp":1358226060000} ]; let sorted = groupBy(list, function(item){ return [item.name]; }); console.log(sorted);
具体实现思路:
函数groupBy有两个形参,一为对象数组,二为匿名函数(该函数功能:返回对象的某个指定属性的属性值并存放在数组中);
groupBy函数内,先创建一个空对象;
然后forEach遍历对象数组,遍历时要执行的函数中只有一个形参o(数组中的每个元素);
由于下面函数调用是想用name来分组,因此let group = JSON.stringify( f(o) ),相当于先获取到对象数组list中的name属性对应的属性值并放入数组中:["John"],然后再将属性值转换为json字符串:"["John"]";
groups[group] = groups[group] || [],在js中对象也是关联数组,因此这里相当于做了两件事,一是把group作为groups的key,二是将对应的value初始化,第一次执行为空数组,循环执行时找到相同的name时保持不变;
groups[group].push( o ),这句相当于把list中每个对象压入数组中作为value;
最后,Object.keys(groups)是取出groups对象中的所有key,然后遍历一个个key组成的新数组,返回分好了组的二维数组,至此大功告成~~~
结果如下:
[ [ { name: "John", Average: 15, High: 10, DtmStamp: 1358226000000 }, { name: "John", Average: 18, High: 87, DtmStamp: 1358226000000 }, { name: "John", Average: 16, High: 87, DtmStamp: 1358226060000 }, { name: "John", Average: 17, High: 45, DtmStamp: 1358226060000 } ], [ { name: "Jane", Average: 16, High: 92, DtmStamp: 1358226000000 }, { name: "Jane", Average: 17, High: 45, DtmStamp: 1358226000000 }, { name: "Jane", Average: 15, High: 10, DtmStamp: 1358226060000 }, { name: "Jane", Average: 18, High: 92, DtmStamp: 1358226060000 } ] ]
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/91855.html
摘要:接收三个参数分别为回调和,其中与是可选参数。官网释义排序一个列表组成一个组,并且返回各组中的对象的数量的计数。类似,但是不是返回列表的值,而是返回在该组中值的数目。 继续前面的内容,前文我们提到了很多方法的讲解,其实到这里就已经差不多了,因为大部分代码其实都是套路,一些基础函数再灵活变化就可以组成很多实用的功能。 _.sortBy = function(obj, iteratee,...
摘要:实现数组更多的高阶函数吾辈的博客原文场景虽说人人平等,但有些人更加平等。若是有一篇适合萌新阅读的自己实现数组更多操作的文章,情况或许会发生一些变化。类似于的初始值,但它是一个函数,避免初始值在所有分组中进行累加。 JavaScript 实现数组更多的高阶函数 吾辈的博客原文: https://blog.rxliuli.com/p/fc... 场景 虽说人人平等,但有些人更加平等。 为...
摘要:聚合后没有用函数,会返回一个用函数后会显示计算结果组合之后,切片,查看的和。可以设定计算方法对列进行了切片,如果的均值小于,则不显示二部的均值低于,所以结果中没有二部数据。 本节学习groupby 引用激励数据,连接数据库jili表(代码省略)数字简单计算本节内容前面是运用sum/mean等函数对数字简单计算 jili.mean() #求均值 jili.mean(axis = col...
摘要:否则,直接循环去拼接该值返回按照指定的方法对数组元素进行分组归类。使用创建一个对象,对象的键是生成的结果,值是符合该键的所有数组元素组成的数组。微信公众号秒,从入门到放弃之三 原文链接:JavaScript30秒, 从入门到放弃之Array(三)水平有限,欢迎批评指正 flattenDepth Flattens an array up to the specified depth....
摘要:随机洗牌算法说实话,以前理解数组的排序,都是将数组按照一定的逻辑由大到小或者由小到大排序,我自己是没有碰到过随机打乱数组排序的问题。然后里用的是所谓的洗牌算法,很高效。总结又是三个知识点,分别是随机洗牌分组和函数的实现,没什么复杂的。 这是第三篇关于 Underscore 的源码解读,最近一段时间学的东西很少,自己太忙了,一方面忙着找实习,晚上回去还要写毕业论文。毕业论文真的很忧伤,因...
阅读 3727·2021-11-23 09:51
阅读 4133·2021-11-15 11:37
阅读 3484·2021-09-02 15:21
阅读 2715·2021-09-01 10:31
阅读 844·2021-08-31 14:19
阅读 813·2021-08-11 11:20
阅读 3276·2021-07-30 15:30
阅读 1661·2019-08-30 15:54