2012-07-04 57 views
0

我有對象的數組是這樣的:JS - 如何基於在對象的數組另一個鍵的值更改一個關鍵的價值

var chartData = [{count: 0, idTag: "24"} 
       {count: 0, idTag: "25"} 
       {count: 0, idTag: "26"}] 

我的代碼做了一些工作,並生成一個數字(totalValue)。如果totalValueidTag相匹配,其count被增加了一個:

for (i=0; i<timesFlipped; i++) { 
    totalValue = runTrial(); 
    for (j=0; j<chartData.length; j++) { 
     if (chartData[j].idTag === totalValue) { 
      chartData[j].count += 1; 
      break; 
     } 
    } 
} 

這是一個簡單的例子,但chartData可容納幾十個對象,timesFlipped可成千上萬的迭代。

這是根據匹配idTag值更改count值的最佳方法嗎?有沒有一種方法可以找到正確的idTag值的數組的索引,而無需遍歷整個對象數組? http://blue.butler.edu/~aazman/coupling/


更新:

感謝所有的建議,如果你想要更多的上下文

這裏是我工作的頁面。基於我所看到的,我有點形成了自己的解決方案。關於這使我對我的解決方案的項目多一點背景:

  • chartData和最小IDTAG值的長度是根據用戶輸入的計算,當他們點擊提交一旦minlength計算
  • (因此最大IDTAG是已知的),chartData被迭代初始化:

var min = 23-5*numNickel-numPenny; //numNickel & numPenny are the user inputs

var length = 5*(2*numNickel+1)+2*numPenny;

var tempTag = min;

for (j=0;j<length;j++) {

chartData[j] = {count: 0, idTag = tempTag};

tempTag++;

}

  • 至於原因,特別是在遊戲規則中, idTag值(不管有多少)以idTag:25(例如, idTags = {24,25,26}或idTags = {20,21,22,23,24,25,26,27,28,29,30}。無論長度爲chartData,長度將始終爲奇數,並且idTag:25始終爲[(chartData.length-1)/2]'指數。

因此,如果爲chartData的idTags是{20,21,22,23,24,25,26,27,28,29,30},如果runTrial()給出totalValue = 22,然後idTag:22將永遠在索引(totalValue - min)

所以我改變了數被提高到chartData和方式的初始化:

for (j=0; j<length; j++) { 
    chartData[j] = {count: 0}; //based on what I'm doing with chartData next, I need each index to still be an object 
} 

for (i=0; i<timesFlipped; i++) { 
    totalValue = runTrial(); 
    var index = totalValue - min; 
    chartData[index].count++; 
} 

所以感謝所有您的幫助:)

+0

該數組由'idTag'排序? – zerkms

+1

你可以自由改變chartData的結構嗎? – Dancrumb

+0

@zerkms是的,數組是按idTag排序的。該數組是按順序創建的,所以它按照定義進行排序。 – azmanam

回答

0

我會建議使用客戶端數據庫存儲機制,讓查詢爲你做點數。

這使得它更overseeable和來自不同virusscanners減少menory警告,再加上你不需要重新獲取數據每次。

另一種方法是使用服務器端數據庫並通過json檢索想要的值。

另一形式給出toprevent瀏覽器凍結是讓一個webworker你的循環運行因此它的線程和犯規鎖定瀏覽器。

0

您可以創建一個指向chartData數組中的對象,像這樣另一個對象:

var idToChart = {}; 
for (var i = 0; i < chartData.length; i++) { 
    var currChart = chartData[i]; 
    idToChart[currChart.idTag] = currChart; 
} 

然後用

var chart = idToChart[totalValue]; 
chart.count++; 

訪問對象的屬性應該是比通過循環更快數組每次。

如@zerkms指出的那樣,您的數組按idtag排序,您甚至不需要創建另一個對象並可以直接訪問該數組。理想情況下,chartData將以idToChart或排序的數組格式開始。

0

我寧願保持中間散列帶有「IDTAG」值作爲密鑰和其作爲值計數,與執行該操作的for循環,然後從中間散列生成charData一次for循環完成。

0

如果你隨意改變chartData的結構,爲什麼不讓它散,而不是一個數組?

var chartData = {24: 0, 
       25: 0, 
       26: 0}; 

然後循環將成爲

for (i=0; i<timesFlipped; i++) { 
    chartData[runTrial()]++;   
} 
相關問題