JavaScript - 创建一个未排序的数组,其中包含重复元素和唯一元素的总和

时间:2016-05-22 06:38:19

标签: javascript jquery arrays

我正在尝试从现有数组创建一个新数组。条件是如果元素是重复的,那么对这些元素求和。有关详细信息,请参阅下面的示例,因为我无法清楚地解释:

输入:

object[] arr = new object[4];
arr[0] = 1;
arr[1] = "abc";
arr[2] = 'c';
arr[3] = 12.25

输出:

var arrayA = ["2", "1", "4", "2", "5", "1", "3", "2"];

这里arrayB [0] = 2s之和(2 + 2 + 2),arrayB [1] = 1s之和(1 + 1)

我尝试了很多但却无法弄清楚如何实现这一目标。

请帮忙!

5 个答案:

答案 0 :(得分:1)

var arrayA = ["2", "1", "4", "2", "5", "1", "3", "2"];
var arrayB = [];

for (var i = 0; i < arrayA.length; i++) {
  if (arrayA.indexOf(arrayA[i]) === i) {
    var count = 1;
    for (var j = i + 1; j < arrayA.length; j++) {
      if (arrayA[j] === arrayA[i]) {
        count++;
      }
    }
    arrayB.push(arrayA[i] * count);
  }
}

console.log(arrayB);
// [ 6, 2, 4, 5, 3 ]

答案 1 :(得分:1)

你可以这样做

&#13;
&#13;
 arrayA = ["2", "1", "4", "2", "5", "1", "3", "2"];
 //make a set 
 var set =  new Set(arrayA);
 var arrayB = [];
 set.forEach(function(a) {
   //for each set find in the original arrayA
   var len = arrayA.filter(function(f) {
     return f == a;
   });
   //push in arrayB set element * number of it occurance in original array
   arrayB.push((+a) * (len.length));
 })
 console.log(arrayB)
&#13;
&#13;
&#13;

答案 2 :(得分:1)

你可以通过第一次循环来总结它们,第二次重新创建数组:

var arrayA = ["2", "1", "4", "2", "5", "1", "3", "2"];
var arrayB = sumDuplicates(arrayA);

console.log(arrayB);

function sumDuplicates(arr) {
  var obj = {}, res = [];

  for(var i = 0, l = arr.length; i < l; i++)
    obj[ arr[i] ] = (obj[ arr[i] ] || 0) + +arr[i]; // +arr[i] converts them to Numbers
  // Now, obj = {"2": 6, "1": 2, "4": 4, "5": 5, "3": 3}
  for(var i = 0, l = arr.length; i < l; i++) 
    if(arr.indexOf( arr[i] ) >= i) res.push( "" + obj[ arr[i] ] ); // Back to String

  return res;
}

答案 3 :(得分:1)

这应该有效:

var arrayA = ["2", "1", "4", "2", "5", "1", "3", "2"];
var tmp={};
for (var i=0; i<arrayA.length; i++)
    tmp[arrayA[i]] = (tmp[arrayA[i]]||0)+1;

var res=[];
for (var i=0; i<arrayA.length; i++)
    if(tmp[arrayA[i]]) {
        res.push(arrayA[i]*tmp[arrayA[i]]);
        delete tmp[arrayA[i]];
    }

res将是:

[6, 2, 4, 5, 3]

答案 4 :(得分:1)

  1. 使用下面给出的地图解决方案:

    var arrIn = ["2", "1", "4", "2", "5", "1", "3", "2"];
    var arrOut = sumOfDupl(arrIn);
    
    console.log(arrOut);
    
    function sumOfDupl(arr) {
      var mapKey = new Map();
      var mapSum = {};
      var resultArray = [];
    
      for(var i = 0; i < arr.length; i++) {
        mapSum[arr[i]] = (+ mapSum[arr[i]])?(+ mapSum[arr[i]] + (+ arr[i])): (+ arr[i]);
        mapKey.set(arr[i], 1);
      }
    
      for (var [key, value] of mapKey) {
        resultArray.push(mapSum[key]);  
      }                  
    
      return resultArray;
    }