javascript - 关于push()合并数组的问题。
黄舟
黄舟 2017-04-11 12:33:59
[JavaScript讨论组]
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]);
        }
    }
}
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(7)
高洛峰

你的去重算法不对,在第二个循环里,每个都是跟 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]);
    }
}
伊谢尔伦

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

ringa_lee

为什么不用 concat

PHP中文网

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

for(var i = 0; i < newScores.length; i++){
    if(scores.indexOf(newScores[j]) === -1){
        scores.push(newScores[i]);
    }
}
PHP中文网
Array.prototype.push.apply(scores, newScores)
高洛峰

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

迷茫

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号