资讯专栏INFORMATION COLUMN

JS中的groupBy方法

bigdevil_s / 2940人阅读

摘要:最近工作中需要写一些运营数据报表的页面,后端返回的数据都是未处理过的,所以,大量的运算任务交给了前端来做,这其中有一个功能就是对数据进行分组,一开始我自己也尝试写了一些,但代码量比较大,显得很繁琐,直到后来在上看到了某位大牛写的方法,非常简

最近工作中需要写一些运营数据报表的页面,后端返回的数据都是未处理过的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

相关文章

  • 1625行,解开 underscore.js 的面纱 - 第四章

    摘要:接收三个参数分别为回调和,其中与是可选参数。官网释义排序一个列表组成一个组,并且返回各组中的对象的数量的计数。类似,但是不是返回列表的值,而是返回在该组中值的数目。 继续前面的内容,前文我们提到了很多方法的讲解,其实到这里就已经差不多了,因为大部分代码其实都是套路,一些基础函数再灵活变化就可以组成很多实用的功能。 _.sortBy = function(obj, iteratee,...

    zhaochunqi 评论0 收藏0
  • JavaScript 实现数组更多的高阶函数

    摘要:实现数组更多的高阶函数吾辈的博客原文场景虽说人人平等,但有些人更加平等。若是有一篇适合萌新阅读的自己实现数组更多操作的文章,情况或许会发生一些变化。类似于的初始值,但它是一个函数,避免初始值在所有分组中进行累加。 JavaScript 实现数组更多的高阶函数 吾辈的博客原文: https://blog.rxliuli.com/p/fc... 场景 虽说人人平等,但有些人更加平等。 为...

    aervon 评论0 收藏0
  • 数据科学 第 3 章: 9 累计与分组 groupby

    摘要:聚合后没有用函数,会返回一个用函数后会显示计算结果组合之后,切片,查看的和。可以设定计算方法对列进行了切片,如果的均值小于,则不显示二部的均值低于,所以结果中没有二部数据。 本节学习groupby 引用激励数据,连接数据库jili表(代码省略)数字简单计算本节内容前面是运用sum/mean等函数对数字简单计算 jili.mean() #求均值 jili.mean(axis = col...

    wemallshop 评论0 收藏0
  • JavaScript30秒, 从入门到放弃之Array(三)

    摘要:否则,直接循环去拼接该值返回按照指定的方法对数组元素进行分组归类。使用创建一个对象,对象的键是生成的结果,值是符合该键的所有数组元素组成的数组。微信公众号秒,从入门到放弃之三 原文链接:JavaScript30秒, 从入门到放弃之Array(三)水平有限,欢迎批评指正 flattenDepth Flattens an array up to the specified depth....

    FrancisSoung 评论0 收藏0
  • Underscore 源码(三)随机洗牌算法

    摘要:随机洗牌算法说实话,以前理解数组的排序,都是将数组按照一定的逻辑由大到小或者由小到大排序,我自己是没有碰到过随机打乱数组排序的问题。然后里用的是所谓的洗牌算法,很高效。总结又是三个知识点,分别是随机洗牌分组和函数的实现,没什么复杂的。 这是第三篇关于 Underscore 的源码解读,最近一段时间学的东西很少,自己太忙了,一方面忙着找实习,晚上回去还要写毕业论文。毕业论文真的很忧伤,因...

    silencezwm 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<