合并具有相同“键”的 JSON 对象并使用 JavaScript 添加它们的“值”

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/30833165/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-28 12:45:04  来源:igfitidea点击:

Merge JSON Object with same "key" and add their "value" using JavaScript

javascriptjsonmergekey

提问by marenz2569

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.

感谢您的回答。

回答by Leeish

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/

回答by Matías Fidemraizer

Here's an alternate solution using ECMA-Script Arrayfunctions forEach, someand filter:

这是使用 ECMA-ScriptArray函数的替代解决方案forEachsome以及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>

回答by Cooper Xiong

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 }

回答by Swati Ssk

JSON look like below: 2 scenario Url is common When pass the role -id

JSON 如下所示: 2 场景 Url is common 当传递角色 -id

  1. role- id/name has admin:

    [{"Key":"value1"},{"key":"value2"},{"key":"value3"}]
    
  2. role- id/name has Tester

    [{"Key":"value1"},{"key":"value3"}]
    
  1. 角色- id/name 有管理员:

    [{"Key":"value1"},{"key":"value2"},{"key":"value3"}]
    
  2. 角色- id/name 有测试员

    [{"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,则希望从键值对中获取所有值

i.e.: admin go for a="both"

即:管理员选择 a="both"

check Tester if it has only value3 then b="single"

检查测试器是否只有 value3 然后 b="single"

回答by Ivan Sivak

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/