V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jtsai
V2EX  ›  问与答

JavaScript 数组问题

  •  
  •   jtsai · 2018-09-19 14:36:26 +08:00 · 1170 次点击
    这是一个创建于 2257 天前的主题,其中的信息可能已经有所发展或是发生改变。

    水平实在有限,实在搞不懂下面这个问题,求指点迷津!

    前置问题 [ JavaScript 如何指定删除数组元素] https://www.v2ex.com/t/490787

    // 1
    var l1 = [1,2,3,4,5]
    var l2 = [1,3,5]
    
    for (let i of l1) {
    	if (l2.indexOf(i) !== -1) { // 我们过滤掉 [1,3,5]
    		l1.splice(l1.indexOf(i) ,1)
    	}
    }
    
    console.log(l1) // 得出 [2,4] | 非常好,完全正确
    
    
    // 2
    var l1 = [1,2,3,4,5]
    var l2 = [1,3,5]
    
    for (let i of l1) {
    	if (l2.indexOf(i) === -1) { // 我们过滤掉 [2,4]
    		l1.splice(l1.indexOf(i) ,1)
    	}
    }
    
    console.log(l1) // 得出 [1,3,5] | 非常好,完全正确
    
    
    // 3
    var l1 = [1,2,3,4,5]
    var l2 = [3,4]
    
    for (let i of l1) {
    	if (l2.indexOf(i) === -1) { // 我们过滤掉 [3,4]
    		l1.splice(l1.indexOf(i) ,1)
    	}
    }
    
    console.log(l1) // 得出 [ 2, 3, 4 ] | 整个人都不好了
    
    
    // 3
    var l1 = [1,2,3,4,5]
    var l2 = [3,4]
    
    for (let i of l1) {
    	if (l2.indexOf(i) !== -1) { // 我们过滤掉 [1,2,5]
    		l1.splice(l1.indexOf(i) ,1)
    	}
    }
    
    console.log(l1) // 得出 [ 1, 2, 4, 5 ] | 整个人都不好了
    

    求 JavaScript 如何指定删除数组元素

    7 条回复    2018-09-21 16:31:37 +08:00
    jtsai
        1
    jtsai  
    OP
       2018-09-19 14:39:22 +08:00
    ```
    // 有时返回的组合也可能是这样的

    // 1
    var l1 = [1,2,3,4,5]
    var l2 = [2]

    for (let i of l1) {
    if (l2.indexOf(i) !== -1) { // 过滤掉 [2]
    l1.splice(l1.indexOf(i) ,1)
    }
    }

    console.log(l1) // 得出 [1,3,4,5]


    // 2
    var l1 = [1,2,3,4,5]
    var l2 = [2]

    for (let i of l1) {
    if (l2.indexOf(i) === -1) { // 过滤掉 [1,3,4,5]
    l1.splice(l1.indexOf(i) ,1)
    }
    }

    console.log(l1) // 得出 [2,4]

    // 不明白错在哪里
    ```
    littlewin
        2
    littlewin  
       2018-09-19 14:45:33 +08:00   ❤️ 1
    for 循环遍历过程中,改变原数组,后续的元素下标都变了
    jtsai
        3
    jtsai  
    OP
       2018-09-19 14:46:40 +08:00
    @littlewin 嗯,所有如何才能指定删除数组元素
    jtsai
        4
    jtsai  
    OP
       2018-09-19 14:49:29 +08:00
    @littlewin 下标变了,下个循环的 indexOf 获取的值理论上也变了,因为是动态的,我想得比较美好。而且他这个情况,有的数据正常,有的不正常,真的超出我的理解范围。不过如果能直接也我解决办法,我们也可以忽略其他问题,蟹蟹
    heimeil
        5
    heimeil  
       2018-09-19 14:50:07 +08:00   ❤️ 1
    你需要一个新数组去保留需要的元素,而不是去改变正在迭代的原数组
    littlewin
        6
    littlewin  
       2018-09-19 14:50:58 +08:00   ❤️ 1
    笨办法就增加个中间变量用于遍历咯

    其实可以参考下 lodash 的 difference 方法
    https://lodash.com/docs/4.17.10#difference
    doublelam
        7
    doublelam  
       2018-09-21 16:31:37 +08:00   ❤️ 1
    const removeOne = (index, array) => array.slice(0, index).concat(array.slice(index + 1));
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1256 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 18:07 · PVG 02:07 · LAX 10:07 · JFK 13:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.