簡體   English   中英

合並具有相同“鍵”的JSON對象,並使用JavaScript添加其“值”

[英]Merge JSON Object with same “key” and add their “value” using JavaScript

我的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}
]}

我正在尋找一種解決方案,將所有相同的鍵合並,並將合並后的鍵的值相加在一起,得到如下所示的效果。

{"rows":[
    {"key":["zeit.de"],"value":398},
    {"key":["google.com"],"value":49},
    {"key":["spiegel.de"],"value":54},
    {"key":["netmng.com"],"value":49}
]}

感謝您的回答。

 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/

這是使用ECMA腳本Array函數forEachsomefilter的替代解決方案:

 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> 

您可以嘗試如下操作:

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/

你可以用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如下所示:2個場景Url很常見當傳遞角色-id時

  1. 角色-ID /名稱具有管理員:

     [{"Key":"value1"},{"key":"value2"},{"key":"value3"}] 
  2. 角色-ID /名稱具有測試儀

     [{"Key":"value1"},{"key":"value3"}] 

沒有鍵:測試儀的值2

例如:

全局變量字符串a,b;

要從鍵值對中獲取所有值(如果它具有JSON中的value2和value3)

即:管理員去一個=“都”

檢查測試器是否只有value3,然后b =“ single”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM