首页 > 关于push()合并数组的问题。

关于push()合并数组的问题。

var scores = [90,70,58,60];
var newScores = [88, 55, 60];
for(var i = 0; i < scores.length; i++){
    for(var j = 0; j < newScores.length; j++){
        if(scores[i] !== newScores[j]){
        scores.push(newScores[j]);
        }
    }
}

为什么不用 concat


楼上说的对啊,一边遍历一遍push,最终会崩溃啊!


这种问题为什么不自己调试看看呢,到底是哪里逻辑有问题?


Array.prototype.push.apply(scores, newScores)

你的去重算法不对,在第二个循环里,每个都是跟 scores 某个固定位置的进行比较的,并没与它所有的进行比较。所以你这个程序会一直跑下去直到把资源耗光。

正确的逻辑是:把当前要加入的某个值,与原来已经存在的所有值进行对比,一但找到有相同的,则中止 循环,抛弃这个值,去处理下一个要加入的值。如果找完都没找到相同的,则加进去

var scores = [90, 70, 58, 60];
var newScores = [88, 55, 60];

for (var j = 0; j < newScores.length; j++) {
    var found = false;
    for (var i = 0; i < scores.length; i++) {
        if (scores[i] === newScores[j]) {
            found = true;
            break;
        }
    }
    if (!found) {
        scores.push(newScores[j]);
    }
}

如果使用 Array.prototype.indexOf 来检索已存在的值,逻辑会更清楚

var scores = [90, 70, 58, 60];
var newScores = [88, 55, 60];

for (var j = 0; j < newScores.length; j++) {
    if (scores.indexOf(newScores[j]) < 0) {
        scores.push(newScores[j]);
    }
}

你的问题是浏览器为什么崩溃了是吗?你循环的肯定是不对的。
这个简单点,好理解。

for(var i = 0; i < newScores.length; i++){
    if(scores.indexOf(newScores[j]) === -1){
        scores.push(newScores[i]);
    }
}

为什么浏览器会崩溃,因为他在遍历这个数组scores的时候,又把newScores[j] push进去,导致scores的长度有变化,这对浏览器来说他是该以原来的长度遍历还是以现在的长度去遍历呢?它接受不了就崩溃了,所以切忌在遍历数组时不要对数组的长度进行操作

【热门文章】
【热门文章】