对数组进行分组和求和

时间:2016-04-29 06:30:03

标签: javascript arrays

我正在尝试动态检索,计算和存储数组中的一些信息。

我拥有的信息是:

var myArrayID = [];
    myArrayID = ['1', '2', '3', '4', '5', '1', '2', '3', '4', '5', '1', ........ '5']; 
   //100 ID in myArrayID that has been sorted in order 

var myArrayScore = [];
    myArrayScore = ['100', '70', '80', '88', '23', '99', ....... '20'];
  //100 Score in myArrayScore that has been sorted in order

简而言之

myArrayID[0]引用myArrayScore[0] ----> ID 1的得分为100

...

myArrayID[99]引用myArrayScore[99] ----> ID 5的得分为20

我想在不使用我的硬编码方法的情况下获得每个ID的总分

我的方法是

var ID1 = 1;
var ID2 = 2;
var ID3 = 3;
var ID4 = 4;
var ID5 = 5;

var ID1Score = 0;
var ID2Score = 0;
var ID3Score = 0;
var ID4Score = 0;
var ID5Score = 0;

for(var i in myArrayID)
{
     if(myArrayID[i] === ID1)
     {
         ID1Score += myArrayScore[i];
     }
     if(myArrayID[i] === ID2)
     {
         ID1Score += myArrayScore[i];
     }
     if(myArrayID[i] === ID3)
     {
         ID1Score += myArrayScore[i];
     }
     if(myArrayID[i] === ID4)
     {
         ID1Score += myArrayScore[i];
     }
     if(myArrayID[i] === ID5)
     {
         ID1Score += myArrayScore[i];
     }     
}

此方法有效,但它是硬编码的。

我是否知道无论如何动态编码,

从某种意义上说,即使我的数组发生了变化(假设我有9个ID),但它仍处于排序顺序,并且仍然包含相同的LENGTH。

3 个答案:

答案 0 :(得分:1)

var myArrayID = ['1', '2', '3', '4', '5', '1', '2', '3', '4', '5']; 
var myArrayScore = ['100', '70', '80', '88', '23', '100', '70', '80', '88', '23'];


var _f = {};

myArrayID.forEach(function(el, i){
  
  if(_f.hasOwnProperty(el)){
    _f[el] += +myArrayScore[i];
  }
  
  else{
   _f[el] = +myArrayScore[i]; 
  }
  
});

alert(JSON.stringify(_f));

// Score for first:
alert("1st Score: "+_f["1"]);

// Score for second:
alert("2nd Score: "+_f["2"]);

答案 1 :(得分:0)

尝试这样的事情

var outputMap = {};
myArray.forEach(function(val,index){
  outputMap[val] = outputMap[val] || 0;
  outputMap[val] += myArrayScore[index];
});

现在outputMap将为每个个人ID提供总得分值。

<强>样本

&#13;
&#13;
var myArrayID = ['1', '2', '3', '4', '5', '1', '2', '3', '4', '5']; 
var myArrayScore = ['100', '70', '80', '88', '23', '100', '70', '80', '88', '23'];

var outputMap = {};
myArrayID.forEach(function(val,index){
  outputMap[val] = outputMap[val] || 0;
  outputMap[val] += parseInt(myArrayScore[index],10);
});

document.body.innerHTML += JSON.stringify(outputMap,0,4);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

您可以使用对象对结果进行分组,并使用Array#forEach进行迭代。

至少你需要转换为数字。

&#13;
&#13;
var myArrayID = ['1', '2', '3', '4', '5', '1', '2', '3', '4', '5', '1', '5'],
    myArrayScore = ['100', '70', '80', '88', '23', '99', '20', '8', '9', '10', '11', '12'],
    score = {};

myArrayID.forEach(function (index) {
    score[index] = (score[index] || 0) + +myArrayScore[index] || 0;
});

document.write('<pre>' + JSON.stringify(score, 0, 4) + '</pre>');
&#13;
&#13;
&#13;