[英]js - How to change one key's value based on another key's value in array of objects
我有一个这样的对象数组:
var chartData = [{count: 0, idTag: "24"}
{count: 0, idTag: "25"}
{count: 0, idTag: "26"}]
我的代码做了一些工作,并生成一个数字( totalValue
)。 如果totalValue
与idTag
匹配,则其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值是根据用户单击提交时的输入来计算的 min
length
和length
(从而知道了最大idTag), chartData
迭代初始化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:25
对称居中(例如idTags = {24,25,26}或idTags = {20,21,22,23,24 ,25,26,27,28,29,30}。无论chartData
的长度chartData
,该长度始终为奇数, idTag:25
始终为第[(chartData.length-1)/2]
个索引。 因此,如果chartData的chartData
为{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++;
}
因此,感谢大家的帮助:)
我建议使用客户端数据库存储机制,并让查询为您进行计数。
这使其更易于监视,并减少了来自各种病毒扫描程序的警告,而且您不必每次都重新获取数据。
另一种方法是使用服务器端数据库并通过json检索所需的值。
防止浏览器冻结的另一种方法是让您的循环在Webworker中运行,以使其成为线程并不会锁定浏览器。
您可以创建另一个对象,该对象指向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
或排序数组格式开始。
我宁愿维护一个以“ idTag”值作为键并将其计数作为值的中间哈希,使用for循环执行操作,然后在for循环完成后从中间哈希生成charData。
如果您可以随意更改chartData的结构,为什么不将其设置为哈希而不是数组呢?
var chartData = {24: 0,
25: 0,
26: 0};
然后循环变成
for (i=0; i<timesFlipped; i++) {
chartData[runTrial()]++;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.