js - 如何根据对象数组中另一个键的值更改一个键的值

时间:2012-07-04 20:38:47

标签: javascript arrays iteration

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

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可以包含数十万个迭代。

这是根据匹配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] }'索引。

因此,如果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++;
}

非常感谢你的帮助:)

4 个答案:

答案 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()]++;        
}