【问题标题】:Merge JSON Object with same "key" and add their "value" using JavaScript合并具有相同“键”的 JSON 对象并使用 JavaScript 添加它们的“值”
【发布时间】:2015-08-30 05:45:49
【问题描述】:

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

感谢您的回答。

【问题讨论】:

  • 循环遍历对象并将项目加载到一个新对象中,使用 += 键将新值添加到前一个对象中。

标签: javascript json merge key


【解决方案1】:

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/

【讨论】:

    【解决方案2】:

    你可以试试这样的:

    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/

    【讨论】:

      【解决方案3】:

      这是使用 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);
      &lt;div id="result"&gt;&lt;/div&gt;

      【讨论】:

        【解决方案4】:

        你可以使用 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 }
        

        【讨论】:

          【解决方案5】:

          JSON 如下所示:2 场景 Url 通用时传递角色-id

          1. role- id/name 有管理员:

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

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

          测试人员没有 key:value2

          例如:

          全局变量字符串a,b;

          如果键值对具有 JSON 中的 value2 和 value3,则希望从键值对中获取所有值

          即:管理员 去一个=“两者”

          检查测试仪 如果它只有 value3 那么 b="单"

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-07-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-12-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多