【问题标题】:Addition of numbers by comparing it's ID & push it into new array通过比较其 ID 来添加数字并将其推送到新数组中
【发布时间】:2017-12-28 12:02:37
【问题描述】:

我想将所有具有相同 seq id 的数字相加,并将其与总和值一起推送到名为 final 的新数组中,如下所示。

输入 =>

$scope.initial = [{seq:11, name:'ABC', number:20},
                  {seq:11, name:'ABC', number:50},
                  {seq:11, name:'ABC', number:80},
                  {seq:12, name:'DEF', number:30},
                  {seq:13, name:'JKL', number:10},
                  {seq:13, name:'JKL', number:15}];

输出 =>

$scope.final  = [{seq:11, name:'ABC', number:150},
                 {seq:12, name:'DEF', number:30},
                 {seq:13, name:'JKL', number:25}];

谢谢!

【问题讨论】:

  • 也请分享您的尝试。
  • @gurvinder372 感谢您的提问!我已经简化了这个问题,在我的代码中数据集是不同的。

标签: javascript arrays angularjs json


【解决方案1】:
 $scope.final = [];
 var acc = {};

 for(const {seq, name, number} of $scope.initial){

   if(seq === acc.seq && name === acc.name){
     acc.number += number;
   }else{
     $scope.final.push(acc = {seq, name, number});
   }

 }

只需使用累加器来跟踪当前结果元素。然后检查当前迭代的元素是否与该累加器匹配,如果是,则相加,如果没有,则将当前元素添加为新的累加器。

【讨论】:

  • 也许需要注意它正在使用for of 循环,他们可能需要使用像 Babel 这样的转译器才能在浏览器上正常工作。
  • @Jonas W. 它将正确推送到最终数组,但没有发生添加。在第一个循环中,值被推送而不添加
  • @JonasW。谢谢你!由于某些数据类型不匹配,我没有得到。
【解决方案2】:

循环数组并检查它是否有seq,如果没有则添加它

var m = [{
    seq: 11,
    name: 'ABC',
    number: 20
  },
  {
    seq: 11,
    name: 'ABC',
    number: 50
  },
  {
    seq: 11,
    name: 'ABC',
    number: 80
  },
  {
    seq: 12,
    name: 'DEF',
    number: 30
  },
  {
    seq: 13,
    name: 'JKL',
    number: 10
  },
  {
    seq: 13,
    name: 'JKL',
    number: 15
  }
];
var grouped = [];
m.forEach(function(a) {
  if (!this[a.seq]) {
    this[a.seq] = {
      seq: a.seq,
      name: a.name,
      number: 0
    };
    grouped.push(this[a.seq]);
  }
  this[a.seq].number = (+this[a.seq].number + +a.number);
}, Object.create(null));

console.log(grouped);

【讨论】:

    【解决方案3】:

    你可以使用 reduce 来完成你的任务:

    $scope.initial = [
        {seq:11, name:'ABC', number:20},
        {seq:11, name:'ABC', number:50},
        {seq:11, name:'ABC', number:80},
        {seq:12, name:'DEF', number:30},
        {seq:13, name:'JKL', number:10},
        {seq:13, name:'JKL', number:15}
    ];
    
    var objReduced = arr.reduce(function(acc, cur){
        acc[cur.seq] ? acc[cur.seq].number += cur.number : acc[cur.seq] = cur;
        return acc;
    }, {});
    
    $scope.final = Object.keys(objReduced).map(function(x){ return objReduced[x]; });
    

    【讨论】:

      猜你喜欢
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 2015-06-01
      相关资源
      最近更新 更多