我有一个像这样的对象数组:
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
可以包含数十万个迭代。
这是根据匹配count
值更改idTag
值的最佳方法吗?有没有办法只使用正确的idTag
值找到数组的索引而不迭代整个对象数组?
如果您需要更多上下文,请点击此处我正在处理的页面:http://blue.butler.edu/~aazman/coupling/
更新
感谢所有建议。我根据我的所见,形成了自己的解决方案。关于这个项目的更多背景让我得到了解决方案:
chartData
的长度和最小idTag值是根据用户点击提交时的输入计算的。min
和length
(因此已知最大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: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 :(得分:0)
我建议使用客户端数据库存储机制,让查询为您进行计数。
这使得它更容易被监控并减少来自各种病毒扫描仪的警告,而且你不需要每次都重新获取数据。
另一种方法是使用服务器端数据库并通过json检索所需的值。
另一个aproach toprevent浏览器冻结是让你的循环在webworker中运行所以它的一个线程并没有锁定浏览器。
答案 1 :(得分: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
或排序数组格式开始。
答案 2 :(得分:0)
我宁愿维护一个中间散列,其中“idTag”值作为键,其计数值为value,使用for循环执行操作,然后在for循环完成后从中间散列生成charData。
答案 3 :(得分:0)
如果您可以自由更改chartData的结构,为什么不将其设为哈希而不是数组呢?
var chartData = {24: 0,
25: 0,
26: 0};
然后循环变为
for (i=0; i<timesFlipped; i++) {
chartData[runTrial()]++;
}