【问题标题】:sum of the values of the json arrayjson数组的值的总和
【发布时间】:2017-10-08 09:04:03
【问题描述】:

下面是我的 json 响应生成的数组

 [
        {
    "id": "name1",
    "c1": "10",
    "c2": "20",
    "c3": "30",
    "c4": "40"
        },
    {
    "id": "name2",
    "c1": "20",
    "c2": "40",
    "c3": "25",
    "c4": "38"
        }
    ]

我需要计算除第一个字段之外的字段值的总和,因为我得到的第一个是字段名称

结果数组:

  [
    "c1": 30,
    "c2": 60,
    "c3": 55,
    "c4": 78
      ]

【问题讨论】:

标签: json ecmascript-6 lodash


【解决方案1】:

仅使用 ES6,您可以使用 2 个 Array#reduce 循环来做到这一点:

const data = [{"id":"name1","c1":"10","c2":"20","c3":"30","c4":"40"},{"id":"name2","c1":"20","c2":"40","c3":"25","c4":"38"}];

const result = data.reduce((sums, obj) => Object.keys(obj).reduce((s, k) => {    
    k === 'id' || (s[k] = (s[k] || 0) + +obj[k]);
    
    return s;
}, sums), {});

console.log(result);

或者您可以使用 lodash 的 _.mergeWith()_.omit() 结果中的“id”:

const data = [{"id":"name1","c1":"10","c2":"20","c3":"30","c4":"40"},{"id":"name2","c1":"20","c2":"40","c3":"25","c4":"38"}];

const result = _.omit(_.mergeWith({}, ...data, (objValue = 0, srcValue = 0) => +objValue + +srcValue), 'id');

console.log(result);

 console.log(_.map(result, (v, k) => ({ [k]: v }))); // or as a series of objects
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

【讨论】:

  • 有没有办法将输出更改为以下格式 [ {"c1": 30}, {"c2": 60}, { "c3": 55}, {"c4": 78}]
  • 你可以在结果上使用 lodash 的 _.map() -> _.map(result, (v, k) => ({ [k]: v }));。我在第二个答案中添加了一个示例。
【解决方案2】:

ES6 语法:

const a =  [
        {
    "id": "name1",
    "c1": "10",
    "c2": "20",
    "c3": "30",
    "c4": "40"
        },
    {
    "id": "name2",
    "c1": "20",
    "c2": "40",
    "c3": "25",
    "c4": "38"
        }
    ];

const b = a.reduce((a, v) => {
  Object.keys(v).filter(e => e.startsWith('c')).forEach(k => a[k] = (a[k]) ? a[k] + +v[k] : +v[k]);
  return a;  
}, {});
   
console.log(b)

【讨论】:

    【解决方案3】:
    var values = [{
            "id": "name1",
            "c1": "10",
            "c2": "20",
            "c3": "30",
            "c4": "40"
        },
        {
            "id": "name2",
            "c1": "20",
            "c2": "40",
            "c3": "25",
            "c4": "38"
        }
    ];
    
    var results = {
        "id": "totals",
        "c1": 0,
        "c2": 0,
        "c3": 0,
        "c4": 0
    }
    
    values.forEach(function(item) {
        results.c1 += Number(item.c1);
        results.c2 += Number(item.c2);
        results.c3 += Number(item.c3);
        results.c4 += Number(item.c4);
    });
    
    console.log(JSON.stringify(results));
    

    【讨论】:

      【解决方案4】:

      假设您正在寻找结果对象,而不是对象数组:

      var srcObj = [{
          "id": "name1",
          "c1": "10",
          "c2": "20",
          "c3": "30",
          "c4": "40"
        },
        {
          "id": "name2",
          "c1": "20",
          "c2": "40",
          "c3": "25",
          "c4": "38"
        }
      ];
      
      var destObj = {};
      srcObj.map((itm) => {
        Object.keys(itm).forEach(function (key) {
          if(key == 'id'){return;}
          if(!destObj[key]){
            destObj[key] = 0;
          }
          destObj[key] += parseInt(itm[key]);
        });
      });
      
      console.log(destObj);

      【讨论】:

        【解决方案5】:

        使用lodash试试

        总和

        _.sum([4, 2, 8, 6]);
        // => 20
        

        总结

        var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
        
        _.sumBy(objects, function(o) { return o.n; });
        // => 20
        
        // The `_.property` iteratee shorthand.
        _.sumBy(objects, 'n');
        // => 20
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多