[英]Merge JSON Object with same “key” and add their “value” using JavaScript
My JSON looks like this 我的JSON看起来像这样
{"rows":[
{"key":["zeit.de"],"value":98},
{"key":["google.com"],"value":49},
{"key":["spiegel.de"],"value":20},
{"key":["spiegel.de"],"value":12},
{"key":["spiegel.de"],"value":20},
{"key":["spiegel.de"],"value":12},
{"key":["netmng.com"],"value":49},
{"key":["zeit.de"],"value":300}
]}
and I am looking for a solution to merge all the same keys and add the values of the merged keys together to get something looking like this. 我正在寻找一种解决方案,将所有相同的键合并,并将合并后的键的值相加在一起,得到如下所示的效果。
{"rows":[
{"key":["zeit.de"],"value":398},
{"key":["google.com"],"value":49},
{"key":["spiegel.de"],"value":54},
{"key":["netmng.com"],"value":49}
]}
Thanks for answersing. 感谢您的回答。
var json = '{"rows":[{"key":["zeit.de"],"value":98},{"key":["google.com"],"value":49},{"key":["spiegel.de"],"value":20},{"key":["spiegel.de"],"value":12},{"key":["spiegel.de"],"value":20},{"key":["spiegel.de"],"value":12},{"key":["netmng.com"],"value":49},{"key":["zeit.de"],"value":300}]}'; var obj = JSON.parse(json); var newObj = {}; for(i in obj['rows']){ var item = obj['rows'][i]; if(newObj[item.key[0]] === undefined){ newObj[item.key[0]] = 0; } newObj[item.key[0]] += item.value; } var result = {}; result.rows = []; for(i in newObj){ result.rows.push({'key':i,'value':newObj[i]}); } console.log(result);
https://jsfiddle.net/s8rp84qc/ https://jsfiddle.net/s8rp84qc/
Here's an alternate solution using ECMA-Script Array
functions forEach
, some
and filter
: 这是使用ECMA脚本Array
函数forEach
, some
和filter
的替代解决方案:
var data = { "rows": [{ "key": ["zeit.de"], "value": 98 }, { "key": ["google.com"], "value": 49 }, { "key": ["spiegel.de"], "value": 20 }, { "key": ["spiegel.de"], "value": 12 }, { "key": ["spiegel.de"], "value": 20 }, { "key": ["spiegel.de"], "value": 12 }, { "key": ["netmng.com"], "value": 49 }, { "key": ["zeit.de"], "value": 300 }] }; var merged = { rows: [] }; data.rows.forEach(function(sourceRow) { debugger; if(!merged.rows.some(function(row) { return row.key[0] == sourceRow.key[0]; })) { merged.rows.push({ key: [sourceRow.key[0]], value: sourceRow.value }); } else { var targetRow = merged.rows.filter(function(targetRow) { return targetRow.key[0] == sourceRow.key[0] })[0]; targetRow.value += sourceRow.value; } }); document.getElementById("result").textContent = JSON.stringify(merged);
<div id="result"></div>
You can try something like this: 您可以尝试如下操作:
var newData = {rows: []},
index;
for (var i = 0; i < data.rows.length;i++){
index = newDataContains(data.rows[i].key);
if (index == -1){
newData.rows.push({key: data.rows[i].key, value: data.rows[i].value});
} else {
newData.rows[index].value += data.rows[i].value;
}
}
function newDataContains(key){
for (var i=0; i < newData.rows.length; i++){
if (JSON.stringify(newData.rows[i].key) == JSON.stringify(key)) {
return i;
break;
}
}
return -1;
}
jsfiddle: https://jsfiddle.net/9p81g5j6/ jsfiddle: https ://jsfiddle.net/9p81g5j6/
you can use lodash 你可以用lodash
let result = [{'a': 3, 'b': 2}, {'a': 4, 'c': 1}, {'a': 4, 'c': 1}];
let m = _.reduce((_.uniq(_.flattenDeep(_.map(result, i => _.keys(i))))), function (s, v) {
s[v] = _.sumBy(result, function (o) {
return o[v];
});
return s
}, {});
console.log(m); // { a: 11, b: 2, c: 2 }
JSON look like below: 2 scenario Url is common When pass the role -id JSON如下所示:2个场景Url很常见当传递角色-id时
role- id/name has admin: 角色-ID /名称具有管理员:
[{"Key":"value1"},{"key":"value2"},{"key":"value3"}]
role- id/name has Tester 角色-ID /名称具有测试仪
[{"Key":"value1"},{"key":"value3"}]
no key:value2 is there for Tester 没有键:测试仪的值2
For example: 例如:
Global variable string a, b; 全局变量字符串a,b;
wants to take all of the values from the key-value Pair if it has value2 and value3 from the JSON 要从键值对中获取所有值(如果它具有JSON中的value2和value3)
ie: admin go for a="both" 即:管理员去一个=“都”
check Tester if it has only value3 then b="single" 检查测试器是否只有value3,然后b =“ single”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.