小编典典

JSON数据的JavaScript SUM和GROUP BY

json

这是我对一些JSON数据对象进行JavaScript的首次尝试,并且需要一些建议以正确的方式实现我的目标。

一些服务器端代码实际上生成了我必须使用的JSON格式的字符串,并将其分配给字符串:

var dataString='$DATASTRING$';

但是在服务器替换其数据后,我必须使用的最终结果(当然没有\ r \ n):

var dataString='[ 
 { "category" : "Search Engines", "hits" : 5, "bytes" : 50189 },
 { "category" : "Content Server", "hits" : 1, "bytes" : 17308 },
 { "category" : "Content Server", "hits" : 1, "bytes" : 47412 },
 { "category" : "Search Engines", "hits" : 1, "bytes" : 7601 },
 { "category" : "Business", "hits" : 1, "bytes" : 2847 },
 { "category" : "Content Server", "hits" : 1, "bytes" : 24210 },
 { "category" : "Internet Services", "hits" : 1, "bytes" : 3690 },
 { "category" : "Search Engines", "hits" : 6, "bytes" : 613036 },
 { "category" : "Search Engines", "hits" : 1, "bytes" : 2858 } 
]';

然后,我可以将其更改为要使用的对象。

var dataObject=eval("("+dataString+")");

这使我可以访问数据的各行数据,但是我需要对这些值进行求和,分组和排序。

我需要这样的SQL语句:

SELECT category, sum(hits), sum(bytes) 
FROM dataObject
GROUP BY category
ORDER BY sum(bytes) DESC

我想要的输出将是这样的对象,我可以进一步处理:

var aggregatedObject='[ 
 { "category" : "Search Engines", "hits" : 13, "bytes" : 673684 },
 { "category" : "Content Server", "hits" : 3, "bytes" : 88930 },
 { "category" : "Internet Services", "hits" : 1, "bytes" : 3690 },
 { "category" : "Business", "hits" : 1, "bytes" : 2847 } 
]';

…但是我不知道从哪里开始。

我可以遍历所有类别值,然后首先找到唯一的类别,然后再次循环并对命中和字节求和,然后再次进行排序,但是似乎必须有一种更简单的方法。

客户端页面上已经包含了prototype.js(1.7),但是如果需要的话,我可以添加Underscore,jQuery或其他一些小型库。

我只是不知道用最少的代码来处理查询的最佳,最简单,最小的方法是什么。

有什么建议?


阅读 1045

收藏
2020-07-27

共1个答案

小编典典

您可以使用本机函数.reduce()汇总数据,然后按.sort()进行排序bytes

var result = dataObject.reduce(function(res, obj) {
    if (!(obj.category in res))
        res.__array.push(res[obj.category] = obj);
    else {
        res[obj.category].hits += obj.hits;
        res[obj.category].bytes += obj.bytes;
    }
    return res;
}, {__array:[]}).__array
                .sort(function(a,b) { return b.bytes - a.bytes; });

如果您支持较早的实现,则需要使用shim.reduce()

2020-07-27