2012-07-04 59 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()]++;   
} 
相关问题