JavaScript嵌套循环向数组中添加元素

4

我是一个相对新手程序员,正在处理一个项目时遇到一些问题。

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中。
当我运行代码时,第一个发送的项目被处理,但由于内存问题而停止。我认为这是因为我的代码出了错。
这段代码哪里出了问题?我确信有更好的方法来完成这个任务,但我很好奇哪里出了问题。

看起来你正在将每个消息都推送到数组中,而不管条件是否为真。该条件只是设置一个变量。此外,该推送操作位于两个循环内部。 - Draco18s no longer trusts SE
非常感谢!你有时间帮我纠正一下这段代码吗?这样我就能看出我的逻辑哪里出了问题了。 - Overclocker
原始数组有多大? - hardillb
一个里面有300个条目,另一个大约有4000个。 - Overclocker
3个回答

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(...)函数不是最容易理解的,但它将第二个参数(空数组)和每个广告系列对象依次传递给内联函数。结果应该是一个简单的组总计数组(从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;


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

0

你的第二个for循环中有一个错别字,而且push操作需要在外部循环内进行。

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)

}

谢谢!修正了拼写错误,但仍然存在内存问题! - Overclocker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接