繁体   English   中英

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

[英]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 )。 如果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值是根据用户单击提交时的输入来计算的
  • 一旦计算出min lengthlength (从而知道了最大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值(无论有多少)都围绕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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM