我有JSON为
var newJSON = [{
"key": "India",
"value": "72"
}, {
"key": "India",
"value": "27"
}, {
"key": "Pakistan",
"value": "90"
}, {
"key": "Zimbamwe",
"value": "88"
}, {
"key": "India",
"value": "100"
}, {
"key": "Pakistan",
"value": "172"
}]
我想要如下所示的结果,其中重复的key
值将value
属性添加到一起:
[{
"key": "India",
"value": "199"
}, {
"key": "Pakistan",
"value": "262"
}, {
"key": "Zimbamwe",
"value": "88"
}]
请帮我解决这个问题
答案 0 :(得分:0)
以下是解决方案:
var grouped = [];
var added = [];
for(var i = 0; i < json.length; i++) {
var indexOfCountry = added.indexOf(json[i].key);
if (indexOfCountry >= 0)
{
grouped[indexOfCountry].value = (Number(grouped[indexOfCountry].value) + Number(json[i].value)).toString();
}
else {
grouped.push(json[i]);
added.push(json[i].key);
}
}
grouped
数组是您想要的结果。
答案 1 :(得分:0)
这是return newJSON.reduce(function(result, entry) {
key = entry.key;
result[key] = result[key] || { key: key, value: 0 };
result[key].value += entry.value;
return result;
}, {});
的经典用例,它设计用于获取数组,并以某种方式将其“减少”到其他事物,通过循环遍历它们并在每次迭代时转换结果。
_.mapObject(_.groupBy(newJSON, 'key'), total)
如果您可以使用像Underscore这样的库,可以将其写为
`A(B, C)`
使用我们描述的叙事风格
B
as
使用
取A
C
并`A(B(C))`
C
和
B
作为
选择
A
并newJSON
。然后获取结果并key
到它
我们几乎可以把它读成英文:
使用
获取结果并映射对象total
_.groupBy
并将其分组{ India: [ {key: "India", value: 72}, {key: "India", value: 100... ], ... }
。然后使用total
function total(group) { return sum(group . map(value)); }
生成一个由某个属性键入的对象并返回组,这些组是属于每个组的所有条目的数组:
[ {key: "India", value: 72}, {key: "India", value: 100}, ... ],
_.mapObject
计算每个组的总价值:
sum
所以它转换了一个条目数组
function sum(array) { return array.reduce(add); }
function add(a, b) { return a+b; }
到199.我们使用它来使用value
将条目数组映射到总分数。
此处value
可以写为
function value(entry) { return entry.value; }
和function add (a, b) { return a+b; }
function sum (array) { return array.reduce(add); }
function value (entry) { return entry.value; }
function total (group) { return sum(group . map(value)); }
_.mapObject(_.groupBy(newJSON, 'key'), total)
是一个小实用程序函数,用于检索<style name="Base.AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
属性:
setElevation(4 / context.getResources().getDisplayMetrics().density);
所以完整的解决方案是:
{{1}}
答案 2 :(得分:0)
var result = newJSON.reduce(function(acc, el){
var val = acc.map[el.key];
if(!val){
acc.map[el.key] = val = { key:el.key, value: parseInt(el.value) };
acc.result.push(val);
}else{
val.value += parseInt(el.value);
}
return acc;
},{map:{}, result:[]}).result;
var newJSON = [
{"key":"India","value":"72"},{"key":"India","value":"27"},
{"key":"Pakistan","value":"90"},{"key":"Zimbamwe","value":"88"},
{"key":"India","value":"100"},{"key":"Pakistan","value":"172"}
];
document.getElementById('r').innerHTML = 'newJSON: ' + JSON.stringify(newJSON);
var result = newJSON.reduce(function(acc, el){
var val = acc.map[el.key];
if(!val){
acc.map[el.key] = val = { key:el.key, value: parseInt(el.value) };
acc.result.push(val);
}else{
val.value += parseInt(el.value);
}
return acc;
},{map:{}, result:[]}).result;
document.getElementById('r').innerHTML += '<br /><br />result: ' + JSON.stringify(result);
&#13;
<div id="r"></div>
&#13;