【问题标题】:Javascript Nested Loop Pushing to ArrayJavascript嵌套循环推送到数组
【发布时间】:2017-08-14 22:14:36
【问题描述】:

我对编程比较陌生,并且在我正在进行的项目中遇到了一些问题。

msg.newCG2 = [];
for(i=0;i<msg.newCG.length;i++){
    for(j=0;j<msg.campaignGroup.length;i++){
        if(msg.campaignGroup[j].col10 === msg.newCG[j]){
            msg.groupTotals = msg.groupTotals + msg.campaignGroup[j].col11;
    }
    msg.newCG2.push(msg.newCG[i], msg.groupTotals)
    }
}

基本上,对于 msg.newCG 中的每个“ID”(整数),我想在 msg.campaignGroup 中查找每个 ID,并总结来自 msg.campaignGroup 的具有相同 ID 的所有列表的总数。 col11 - 然后将 ID 和总数推送到一个新数组 - msg.newCG2。

当我运行代码时,第一个项目通过进程发送,但由于内存而停止。我认为这是因为我的代码有错误。

这段代码哪里出错了?我确信总体上有更好的方法可以做到这一点,但我很好奇我哪里出错了。

【问题讨论】:

  • 看起来无论条件是否为真,您都将每条消息推送到数组。条件只是设置一个变量。此外,该推送在两个循环内。
  • 非常感谢!您是否有时间更正此代码,以便我查看我的逻辑哪里出了问题?
  • 原始数组有多大?
  • 一个有 300 个条目,另一个有大约 4000 个条目。

标签: javascript node-red


【解决方案1】:

您的第二个 for 循环中有错字,需要在外循环内进行推送。

msg.newCG2 = [];
for(i=0;i<msg.newCG.length;i++){
    for(j=0;j<msg.campaignGroup.length;j++){
        if(msg.campaignGroup[j].col10 === msg.newCG[i]){
            msg.groupTotals = msg.groupTotals + msg.campaignGroup[j].col11;
        }
    }
    msg.newCG2.push(msg.newCG[i], msg.groupTotals)

}

【讨论】:

  • 谢谢!修正了错字,但仍然出现内存问题!
【解决方案2】:

怎么样:

msg.newCG2 = [];

for (i=0; i < msg.newCG.length; i++) {

    var groupTotal = 0;

    for (j=0; j < msg.campaignGroup.length; j++) {
        if (msg.campaignGroup[j].col10 === msg.newCG[i]){
            groupTotal = groupTotal + msg.campaignGroup[j].col11
        }
    }

    msg.newCG2.push(groupTotal)
}

【讨论】:

    【解决方案3】:

    与循环 120 万次相比,使用单次遍历 4000 个活动组会更有效,按 id 分组以创建所有 id 的总计数组——我喜欢使用 reduce() 函数这个:

    var cgMap = msg.campaignGroups.reduce(function(arr, grp) {
            var grpid = grp.col10;
            var count = grp.col11;
            var total = arr[grpid] || 0;
            arr[grpid] = total + count;
        },
    []);
    

    我知道,reduce(...) 函数并不是最容易理解的,但它需要第二个 arg(空数组)并将其与每个活动组对象依次传递给该内联函数。结果应该是一个简单的组总数数组(来自col11),由组ID(来自col10)索引。

    现在,只需返回在 msg.newCG 中找到的 300 个 id 的总数——而这个 map() 函数为我们完成了这项工作:

    var cgOut = msg.newCG.map(function(gid) {
            return cgMap[gid];  // lookup the total by group id
        }
    );
    

    我在这里做了一些假设,比如组 ID 不是非常大的整数,而且间隔很近(不太稀疏)。从原始代码中,我无法确定您要在msg.newCG2 中返回的数据格式。最终的push() 函数会将 2 个整数附加到数组上——输出组 id 和该组的总数。在平面数组中交错成对的组 id 和总数并不是一个非常有用的数据结构。也许您打算将总值放入由组 ID 索引的数组中?如果是这样,您可以将该行重写为: msg.newCG2[msg.newCG[i]] = msg.groupTotals;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-22
      • 2016-05-18
      • 1970-01-01
      • 2022-07-06
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多