这是我第一次尝试使用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或其他一些小库。
我只是不知道什么是最好的,最简单的,用最少的代码来处理查询。
有什么建议吗?
5条答案
按热度按时间dauxcl2d1#
您可以使用本机函数
.reduce()
聚合数据,然后使用.sort()
按bytes
排序。如果您支持较旧的实现,则需要为
.reduce()
使用shim。0ejtzxu12#
如果你走LINQ.js路线,你可以这样做:
使用Stack Snippets进行演示:
进一步阅读:linqjs group by with a sum
bq3bfh9z3#
给定上面的dataString,下面的代码似乎可以工作。如果类别存在于
groupedObjects
数组中,则其命中和字节被添加到现有对象。否则,它被认为是新的并被添加到groupedObjects数组。此解决方案使用了underscore.js和jQuery
下面是一个jsfiddle演示:http://jsfiddle.net/R3p4c/2/
x4shl7ld4#
z5btuh9x5#
嗨,这里是我写的一个解决方案访问:aggregate_groupby_js on npm或in
用于在对象数组上使用聚合函数的javascript库。基本函数,如SUM,MIN,MAX,AVG,DISTINCT_COUNT,用于整个javascript对象
示例: