2016-03-25 43 views
1

我有一個動態數組,我試圖將數值增加1,如果該鍵存在於數組中。根據我的調試,它會遞增鍵和創建第二個鍵/值對。javascript數組 - 給定鍵的增量值

我的代碼片段:

 for (var i = 0; i < choices.length; i++) { 
      console.log(choices[i]); 
      if (choices[i].YearTermId == 1) { 
       if (!lookup(firstChoice, choices[i].FirstChoiceOptionId)) { 
        firstChoice.push({ 
         key: choices[i].FirstChoiceOptionId, 
         value: 1 
        }); 
       } else { 
        firstChoice[choices[i].FirstChoiceOptionId] = firstChoice[choices[i].FirstChoiceOptionId] + 1; 
       } 

更多的if/else ..

function lookup(arr, name) { 
     for(var i = 0, len = arr.length; i < len; i++) { 
      if(arr[ i ].key === name) 
       return true; 
     } 
     return false; 
    } 
+0

您正在使用的數組應在使用對象。 –

回答

2

你正在使用一個數組,你應該使用一個對象。如果你使用一個對象,你的代碼可以作爲被改寫:

var firstChoice = {}; 

for (var i = 0; i < choices.length; i++) { 
    var firstChoiceOptionId = choices[i].FirstChoiceOptionId; 

    if (choices[i].YearTermId == 1) { 
     firstChoice[firstChoiceOptionId] = firstChoice[firstChoiceOptionId] 
       ? firstChoice[firstChoiceOptionId] + 1 
       : 1; 

     /* ... */ 
    } 
} 

如果你需要的數據作爲陣列之後,只是它映射:

var firstChoiceArray = Object.keys(firstChoice).map(function(key) { 
    return { 
     key: key, 
     value: firstChoice[key] 
    }; 
}); 

相反,如果你有一個輸入數組,想要將其轉換爲對象進行操作,請將其縮小:

var firstChoice = firstChoiceArray.reduce(function(result, current) { 
    result[current.key] = current.value; 

    return result; 
}, {}); 
+0

我想保留它作爲數組鍵/值,因此我可以將數據插入到chart.js後 – arthur

+0

只需將您的操作完成後將其映射到數組。我會更新我的答案。 –

+0

完美的對象方式,謝謝! – arthur

1

我想你應該增加value鍵,如:

firstChoice[choices[i].FirstChoiceOptionId].value ++; 

,我會喜歡將此代碼重寫爲:

var firstChoice = {}; 
for (var i = 0; i < choices.length; i++) { 
    if (choices[i].YearTermId == 1) { 
     if (!firstChoice[choices[i].FirstChoiceOptionId]) { 
      firstChoice[choices[i].FirstChoiceOptionId] = 0; 
     } 
     firstChoice[choices[i].FirstChoiceOptionId]++; 
    } 
} 
console.log(firstChoice); 
+0

我想在1開始值 - 我試圖將數組插入到chart.js之後。當我使用第一個片段時,.value不能讀取未定義的屬性'值'。 – arthur

0

嘗試用Array.map: 示例:

var a = [{key:"ab","value":1},{key:"cd","value":1},{key:"ef","value":1}]; 
a.map(function(item){if(item.key == this){item.value++}}, "cd"); 

所以,一個[1]將具有後該值2。