合并两个有一定值的数组,在浏览器中崩溃

Combine two array that have some value, crash in browser

本文关键字:数组 浏览器 崩溃 两个 合并      更新时间:2023-09-26

如果数组有一些值,我有一个组合数组的函数。这是我的阵列:

var emailAddr = [{
    customerID : "C20061102105257_678",
    emails : ["fandi@gmail.com", "fanjavaid@gmail.com"]
}];
var dataEmail2 = {
    customerID : "C20061102105257_678",
    emails : ["weisk@gmail.com"]
};
var dataEmail3 = {
    customerID : "C20061102105257_600",
    emails : ["eko@gmail.com"]
};
var dataEmail4 = {
    customerID : "C20061102105257_678",
    emails : ["1@gmail.com", "156@gmail.com"]
};

这是我的功能:

function addEmail(emailAddresses) {
    if(emailAddr.length == 0) {
        emailAddr.push(emailAddresses);
    } else {
        // Checking
        for (var i = 0; i < emailAddr.length; i++) {            
            if (emailAddr[i].customerID == emailAddresses.customerID) {
                for (var a = 0; a < emailAddresses.emails.length; a++) {
                    emailAddr[i]['emails'].push(emailAddresses.emails[a]);
                }
            } else {
                emailAddr.push(emailAddresses);
            }
        }
    }
} // End function
addEmail(dataEmail2);
addEmail(dataEmail3);
addEmail(dataEmail4);
console.log(emailAddr);

但当我在中执行else语句时,我的浏览器崩溃了

emailAddr.push(emailAddresses);

如何处理??非常感谢。

这可能会奏效。我想你正试图拥有一个唯一的客户ID数组,其中包含所有电子邮件。

function addEmail(emailAddresses) {
    if(emailAddr.length == 0) {
        emailAddr.push(emailAddresses);
    } else {
        // Checking
        var tempCheck = true;
        for (var i = 0; i < emailAddr.length; i++) {            
            if (emailAddr[i].customerID == emailAddresses.customerID) {
                for (var a = 0; a < emailAddresses.emails.length; a++) {
                    emailAddr[i]['emails'].push(emailAddresses.emails[a]);
                }
                tempCheck = false;
            } 
        }
        if(tempCheck)
        {          
            emailAddr.push(emailAddresses);
        }
    }
} // End function

这里有两个问题。

1-通过添加到当前正在读取的数组中,可以获得一个无限循环。这将导致它扩展,并且您将不断重复阅读此扩展。

2-你实际上并没有把新的对象推到你的数组中,你只是简单地添加了一个对现有对象的引用。这里将发生的情况是,当您添加到对象时,您也在添加到刚刚添加的对象中。换句话说,这里有另一个无限循环

for (var a = 0; a < emailAddresses.emails.length; a++) {
    emailAddr[i]['emails'].push(emailAddresses.emails[a]);
}

因为当你推到你的数组时,你实际上是在推到引用,这意味着它也会无限扩展。要解决此问题,请使用.stice(0)来复制数组,如下所示。

 var emailAddr = [{
        customerID: "C20061102105257_678",
        emails: ["fandi@gmail.com", "fanjavaid@gmail.com"]
    }];
    var dataEmail2 = {
        customerID: "C20061102105257_678",
        emails: ["weisk@gmail.com"]
    };
    var dataEmail3 = {
        customerID: "C20061102105257_600",
        emails: ["eko@gmail.com"]
    };
    var dataEmail4 = {
        customerID: "C20061102105257_678",
        emails: ["1@gmail.com", "156@gmail.com"]
    };
    function addEmail(emailAddresses) {
        if (emailAddr.length == 0) {
            emailAddr.push({ customerID: emailAddresses.customerID, emails: emailAddresses.emails.slice(0) });
        } else {
            // Checking
            var success = false;
            for (var i = 0; i < emailAddr.length; i++) {
                if (emailAddr[i].customerID == emailAddresses.customerID) {
                    success = true;
                    for (var a = 0; a < emailAddresses.emails.length; a++) {
                        console.log("adding : " + emailAddresses.emails[a]);
                        emailAddr[i]['emails'].push(emailAddresses.emails[a]);
                    }
                }
            }
            if (!success) {
                emailAddr.push({ customerID: emailAddresses.customerID, emails: emailAddresses.emails.slice(0) });
            }
        }
    } // End function
    addEmail(dataEmail2);
    addEmail(dataEmail3);
    addEmail(dataEmail4);
    console.log(emailAddr);
function addEmail(emailAddresses) {
    if(emailAddr.length == 0) {
        emailAddr.push(emailAddresses);
    } else {
        // Checking
        for (var i = 0; i < emailAddr.length; i++) {            
            if (emailAddr[i].customerID == emailAddresses.customerID) {
                for (var a = 0; a < emailAddresses.emails.length; a++) {
                   // emailAddr[a]['emails'].push(emailAddresses.emails[a]);
                   //replaced i with a on above line
                   //replaced i with a on above line
                    emailAddr[a]['emails'].push(emailAddresses.emails[a]);
                }
            } else {
                emailAddr.push(emailAddresses);
            }
        }
    }
} // End function
addEmail(dataEmail2);
addEmail(dataEmail3);
addEmail(dataEmail4);
console.log(emailAddr);