0

我有一个这样的对象数组:

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 值是根据用户点击提交时的输入计算的
  • 一旦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]'th 索引。

因此,如果 idTag 的chartDataare{20,21,22,23,24,25,26,27,28,29,30}和 if given ,那么runTrial()将始终位于 index 。totalValue = 22idTag: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++;
}

所以感谢大家的帮助:)

4

4 回答 4

0

You could create another object which points to the objects in the chartData array, like so:

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

and then use

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

Accessing the object's property should be faster than looping through the array each time.

If, as @zerkms pointed out, your array is sorted by idtag, you wouldn't even need to create another object and could access the array directly. Ideally, chartData would start in the idToChart or sorted array format.

于 2012-07-04T20:52:34.897 回答
0

我宁愿维护一个以“idTag”值作为键并将其计数作为值的中间散列,使用 for 循环执行操作,然后在 for 循环完成后从中间散列生成 charData。

于 2012-07-04T20:55:39.297 回答
0

我建议使用客户端数据库存储机制,让查询为您计算。

这使其更易于监督并减少了来自各种病毒扫描程序的警告,而且您无需每次都重新获取数据。

另一种方法是使用服务器端数据库并通过 json 检索所需的值。

防止浏览器冻结的另一种方法是让您的循环在 webworker 中运行,这样它就成为一个线程并且不会锁定浏览器。

于 2012-07-04T20:48:40.963 回答
0

如果您可以随意更改 chartData 的结构,为什么不将其设为哈希而不是数组呢?

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

然后循环变成

for (i=0; i<timesFlipped; i++) {
    chartData[runTrial()]++;        
}
于 2012-07-05T16:18:17.023 回答