为了账号安全,请及时绑定邮箱和手机立即绑定

试图理解这个 JavaScript 重复删除算法中的 for 循环

试图理解这个 JavaScript 重复删除算法中的 for 循环

吃鸡游戏 2021-11-12 16:05:47
首先,这是算法:var removeDuplicates = function(nums) {    for (var i = 0; i < nums.length;) {        if (nums[i] === nums[i + 1]) {            nums.splice(i, 1)        }        else i++    }    return nums};它接受一个排序的数字数组并删除任何重复项以返回修改为仅包含唯一数字的原始数组。我的问题主要是关于for循环的使用。在这个 for 循环中,我们省略了第三条语句,而是i在else条件中递增。如何循环知道检查的下一个指标nums,如果if条件得到满足?IE。如果我们从未命中else,如何i递增?它甚至增加了吗?我知道这可能与我们正在拼接(因此缩短)if 条件中的 nums 数组这一事实有关,但我很难完全理解为什么循环不会在 if 语句完成后立即结束.
查看完整描述

1 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

当你做


nums.splice(i, 1)

这将从索引处的数组中删除 1 个项目i。例如,如果i是 2,则当前数组为


[0, 1, 2, 2, 3, 4]

然后,在splice发生这种情况之后,数组就变成了


[0, 1, 2, 2, 3, 4]

       ^^ REMOVED: Array mutates to

[0, 1, 2, 3, 4]

曾经位于 index 的项目i + 1现在位于 index i,因此for循环的下一次迭代不应递增i。


如果你确实增加了i,那么在删除的项目之后立即出现的每个项目都将被跳过,并且根本不会迭代:


var removeDuplicates = function(nums) {

    for (var i = 0; i < nums.length; i++) {

        if (nums[i] === nums[i + 1]) {

            nums.splice(i, 1)

        }

    }

    return nums

};


console.log(removeDuplicates([0, 1, 1, 1]));


尽管如此,这种风格的代码还是非常令人困惑:当一个对象在迭代过程中发生变化时,可能很不清楚正在实现的逻辑完成了什么。最好通过 Set 进行重复数据删除:


var removeDuplicates = nums => [...new Set(nums)];


console.log(removeDuplicates([0, 1, 1, 1]));


查看完整回答
反对 回复 2021-11-12
  • 1 回答
  • 0 关注
  • 180 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号