Javascript嵌套循环推送到数组

时间:2017-08-14 22:14:37

标签: javascript node-red

我对编程比较陌生,而且我正在处理一个项目的问题。

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,并总结所有具有相同ID的列表的总数,来自msg.campaignGroup。 col11 - 然后将ID和总数推送到新数组 - msg.newCG2。

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

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

3 个答案:

答案 0 :(得分:0)

你的第二个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)

}

答案 1 :(得分:0)

怎么样:

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)
}

答案 2 :(得分:0)

而不是循环1.2M次,在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;