JSON 数据的 JavaScript SUM 和 GROUP BY
JavaScript SUM and GROUP BY of JSON data
这是我第一次尝试使用一些JSON数据对象做JavaScript,需要一些关于实现目标的正确方法的建议。
一些服务器端代码实际上会生成一个 JSON 格式的字符串,我必须使用它并将其分配给一个字符串:
var dataString='$DATASTRING$';
但是在服务器替换其数据(当然没有''r')之后,我必须处理最终结果:
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 }
]';
。但我不知道从哪里开始。
我可以遍历所有类别值并首先找到唯一类别,然后再次循环并对命中数和字节求和,然后再次排序,但似乎必须有一种更简单的方法。
原型.js(1.7)已经包含在客户端页面上,但是如果有必要,我可以添加Underscore,jQuery或其他一些小型库。
我只是不知道什么是最好、最简单、最小的代码来处理查询。
有什么建议吗?
您可以使用本机函数.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; });
如果您支持较旧的实现,则需要使用填充程序进行.reduce()
。
如果你走 LINQ.js 路线,你可以这样做:
var aggregatedObject = Enumerable.From(dataArray)
.GroupBy("$.category", null, function (key, g) {
return {
category: key,
hits: g.Sum("$.hits"),
bytes: g.Sum("$.bytes")
}
})
.ToArray();
堆栈代码段的工作演示:
var dataArray = [
{ 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 ", hits: 1, bytes: 3690 },
{ category: "Search Engines", hits: 6, bytes: 613036 },
{ category: "Search Engines", hits: 1, bytes: 2858 }
];
var aggregatedObject = Enumerable.From(dataArray)
.GroupBy("$.category", null, function (key, g) {
return {
category: key,
hits: g.Sum("$.hits"),
bytes: g.Sum("$.bytes")
}
})
.ToArray();
console.log(aggregatedObject);
<script src="//cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.min.js"></script>
延伸阅读:linqjs 分组依据与总和
给定上面的 dataString,下面的代码似乎有效。它穿过每个对象;如果该类别存在于 groupedObjects
数组中,则其命中数和字节数将添加到现有对象中。否则,它被视为新的并添加到 groupedObjects 数组中。
该解决方案使用下划线.js和jQuery
这是一个jsfiddle演示:http://jsfiddle.net/R3p4c/2/
var objects = $.parseJSON(dataString);
var categories = new Array();
var groupedObjects = new Array();
var i = 0;
_.each(objects,function(obj){
var existingObj;
if($.inArray(obj.category,categories) >= 0) {
existingObj = _.find(objects,function(o){return o.category === obj.category; });
existingObj.hits += obj.hits;
existingObj.bytes += obj.bytes;
} else {
groupedObjects[i] = obj;
categories[i] = obj.category;
i++;
}
});
groupedObjects = _.sortBy(groupedObjects,function(obj){ return obj.bytes; }).reverse();
var obj = [{Poz:'F1',Cap:10},{Poz:'F1',Cap:5},{Poz:'F1',Cap:5},{Poz:'F2',Cap:20},{Poz:'F1',Cap:5},{Poz:'F1',Cap:15},{Poz:'F2',Cap:5},{Poz:'F3',Cap:5},{Poz:'F4',Cap:5},{Poz:'F1',Cap:5}];
Array.prototype.sumUnic = function(name, sumName){
var returnArr = [];
var obj = this;
for(var x = 0; x<obj.length; x++){
if((function(source){
if(returnArr.length == 0){
return true;
}else{
for(var y = 0; y<returnArr.length; y++){
var isThere = [];
if(returnArr[y][name] == source[name]){
returnArr[y][sumName] = parseInt(returnArr[y][sumName]) + parseInt(source[sumName]);
return false;
}else{
isThere.push(source);
}
}
if(isThere.length>0)returnArr.push(source);
return false;
}
})(obj[x])){
returnArr.push(obj[x]);
}
}
return returnArr;
}
obj.sumUnic('Poz','Cap');
// return "[{"Poz":"F1","Cap":45},{"Poz":"F2","Cap":25},{"Poz":"F3","Cap":5},{"Poz":"F4","Cap":5}]"
这是我写的一个解决方案 访问:在 npm 上aggregate_groupby_js 或在 GitHub 上aggregate_groupby_js
用于在对象数组上使用聚合函数的 JavaScript 库。基本函数,如整个 javascript 对象的 SUM、MIN、MAX、AVG
DISTINCT_COUNT例:
var arr = [{`"shape"`:`"square"`,`"color"`:`"red"`,`"used"`:1,`"instances"`:1},
{`"shape"`:`"square"`,`"color"`:`"red"`,`"used"`:2,`"instances"`:1},
{`"shape"`:`"circle"`,`"color"`:`"blue"`,`"used"`:0,`"instances"`:0},
{`"shape"`:`"square"`,`"color"`:`"blue"`,`"used"`:4,`"instances"`:4},
{`"shape"`:`"circle"`,`"color"`:`"red"`,"`used"`:1,`"instances"`:1},
{`"shape"`:`"circle"`,`"color"`:`"red"`,`"used"`:1,`"instances"`:0},
{`"shape"`:`"square"`,`"color"`:`"blue"`,`"used"`:4,`"instances"`:5},
{`"shape"`:`"square"`,`"color"`:`"red"`,`"used"`:2,`"instances"`:1}];
// Specify columns
var columns =[`"used"`, `"instances"`];
// Initialize object
var gb = new GroupBy(arr,columns);
// or
var gb = new GroupBy(arr,[`"used"`, `"instances"`]);
// Call the aggregate functions
gb.sum();
gb.min();
gb.max();
gb.avg();
gb.distinctCount();
- SVG Clear group<g>
- getDocument by id/get input text from button dons'不起作用
- Div and ul list side by side
- radio group + javascript
- TinySort sort by IDs
- Two input forms side-by-side programatically via JavaScript
- ngRepeat filter by array-property
- SQL应该查询's ORDER BY列写入JS代码中
- Qualtrics javascript:以列形式显示pick group rank questiontype中的项目
- jQuery如何显示/隐藏Select by Select
- 将C#RegEx转换为JavaScript会出现错误Invalid Group
- JSON 数据的 JavaScript SUM 和 GROUP BY
- JavaScript 对象数组 Group By 和 Get 值
- jQuery Javascript Group Years by Decades
- `$group`by数组中的唯一项
- group by在ng-options中给出ie中重复的数据
- 动态if在foreach绑定中执行"group by"在视图中
- 如何使用avg和group by子句在sql查询中放置日期范围
- group by/格式化json数据
- Group By in AngularJS