【问题标题】:How to find sum of duplicate values in an array using javascript如何使用javascript查找数组中重复值的总和
【发布时间】:2016-10-15 06:03:30
【问题描述】:

我有以下数组。我的目标是通过从该数组中删除重复值来创建一个新数组。

var xDataValuesdash =  [    [ 'Anantapur', 10, '#C21466' ],
                            [ 'Anantapur', 20, '#A983D0' ],
                            [ 'Chittoor', 30, '#A993D0' ],
                            [ 'Anantapur', 30, '#544DDF' ],
                            [ 'Anantapur', 4, '#A994D0' ],
                            [ 'Chittoor', 40, '#544BDF' ]  ];

即,结果数组必须是

var new_xDataValuesdash = [[ 'Anantapur', 64, '#C21466' ], 
                           [ 'Chittoor', 70, '#544BDF' ]];

删除重复项时,必须将其值添加到 unqiue 值中。

【问题讨论】:

  • 这个重复的逻辑是什么,在每个数组中你有 3 个组件,一个是 anatapur,10 和一些字符串,我知道你必须获取第一个字符串的唯一值并添加下一个值,那么数组中的最后一个,我们应该在这里考虑什么
  • 为什么第一个数组的结果有原始数组的第一个十六进制值,而第二个结果有原始数组的第二个十六进制值?
  • 第三个值可以是副本中的任何值。没关系。

标签: javascript arrays multidimensional-array


【解决方案1】:

试试这个

var xDataValuesdash =  [    [ 'Anantapur', 10, '#C21466' ],
    [ 'Anantapur', 20, '#A983D0' ],
    [ 'Chittoor', 30, '#A993D0' ],
    [ 'Anantapur', 30, '#544DDF' ],
    [ 'Anantapur', 4, '#A994D0' ],
    [ 'Chittoor', 40, '#544BDF' ]  ];

var sum = {},result;

for (var i=0,c;c=xDataValuesdash[i];++i) {
    if ( undefined === sum[c[0]] ) {        
       sum[c[0]] = c;
    }
    else {
        sum[c[0]][1] += c[1];
    }
}
result = Object.keys(sum).map(function(val) { return sum[val]});

alert(JSON.stringify(result));

【讨论】:

    【解决方案2】:

    这是一个简单的解决方案,不是很复杂,但可以完成工作。

    var a = [
        ['Anantapur', 10, '#C21466'],
        ['Anantapur', 20, '#A983D0'],
        ['Chittoor', 30, '#A993D0'],
        ['Anantapur', 30, '#544DDF'],
        ['Anantapur', 4, '#A994D0'],
        ['Chittoor', 40, '#544BDF']
    ];
    
    var findDuplicatesAndSum = function(inptArr) {
        var duplicateIndex = {};
        var outputArr = [];
        for (var i = 0; i < inptArr.length; i++) {
            var item = inptArr[i];
            var collisionIndex = duplicateIndex[item[0]];
            if (collisionIndex > -1) {
                outputArr[collisionIndex][1] += item[1];
            } else {
                outputArr.push(item);
                duplicateIndex[item[0]] = outputArr.length - 1;
            }
        }
        console.log(outputArr);
        return outputArr;
    };
    
    findDuplicatesAndSum(a);
    

    【讨论】:

      【解决方案3】:

      此代码可能会有所帮助。

      var xDataValuesdash =  [    
      	[ 'Anantapur', 10, '#C21466' ],
          [ 'Anantapur', 20, '#A983D0' ],
          [ 'Chittoor', 30, '#A993D0' ],
          [ 'Anantapur', 30, '#544DDF' ],
          [ 'Anantapur', 4, '#A994D0' ],
          [ 'Chittoor', 40, '#544BDF' ]  ];
      var new_DataValuesdash = [];
      for(var i=0; i < xDataValuesdash.length;i++){
      	if(new_DataValuesdash[xDataValuesdash[i][0]] == undefined) {
              new_DataValuesdash[xDataValuesdash[i][0]] = xDataValuesdash[i];
          }
          else {
              // new_DataValuesdash[xDataValuesdash[i][0]] = [];
              new_DataValuesdash[xDataValuesdash[i][0]][1] = new_DataValuesdash[xDataValuesdash[i][0]][1] + xDataValuesdash[i][1];
          }
      }
      console.log(new_DataValuesdash);

      【讨论】:

        【解决方案4】:

        你可以使用for..of循环,Array.prototype.some()Array.prototype.forEach()

        var xDataValuesdash =  [    [ 'Anantapur', 10, '#C21466' ],
                                    [ 'Anantapur', 20, '#A983D0' ],
                                    [ 'Chittoor', 30, '#A993D0' ],
                                    [ 'Anantapur', 30, '#544DDF' ],
                                    [ 'Anantapur', 4, '#A994D0' ],
                                    [ 'Chittoor', 40, '#544BDF' ]  ];
        
        
        var res = [];
        for (var prop of xDataValuesdash) {
          !res.some(value => value && value[0] === prop[0])
          ? res.push(prop)
          : res.forEach(value => {
              if (value[0] === prop[0]) value[1] += prop[1]
            });      
        }
        
        console.log(res);

        【讨论】:

        • 先循环 res 用一些看看是否包含,然后再循环找出增加的地方?
        • @cske 是的。 .some() 检查res 是否包含在索引0 处与for..of 循环中的当前元素具有相同值的元素
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-02
        • 2021-12-06
        • 2019-09-21
        • 1970-01-01
        • 1970-01-01
        • 2022-12-16
        相关资源
        最近更新 更多