评论

js经验分享之for循环区别

for 的简写分场合写才有用 否则就是坑

昨天在做删除列表功能时候碰到的坑  虽然很早以前知道 for(var i in arr)这种方法有坑  但是这么多年简写习惯了 就经常忽略了这个坑  昨天又碰到  特意分享给各位码友  下面我用几段代码举例


const arr = [2, 5];
      const arr2 = [2, 5];
      let list = ['张三', '李四', '王五', '张飞', '关羽', '刘备', '曹操'];
      let list2 = ['张三', '李四', '王五', '张飞', '关羽', '刘备', '曹操'];
      //若要从数组中删除下标为  arr 的值  即 王五  和   刘备
      // 使用for循环遍历  arr  在进行删除  利用常见的for循环删除
 
      /**
       * 方法1  得出结果 list为
       * 0    :   张三
       * 1    :   李四
       * 2    :   张飞
       * 3    :   关羽
       * 4    :   刘备
       *  并没有删除我们想要的值         
       * */
      for (var i in arr) {
          console.log(typeof(i)); //输出为string类型
          list.splice([arr[i]], 1);
          console.log(arr) //  输出得 [2, 5]和  [2, 5, 01: NaN]
          arr.length > 1 && i != arr.length - 1 ? arr[i + 1] -= 1 : '';
          arr.length - 1 == i && this.setData({
              list,
          })
      }
      /**
       * 方法2  得出结果 list2为
       * 0    :   张三
       * 1    :   李四
       * 2    :   张飞
       * 3    :   关羽
       * 4    :   曹操
       * 和我们期望相符合
       */
 
      for (var j = 0; j < arr2.length; j++) {
          console.log(typeof(j)); //输出为number
          list2.splice([arr2[j]], 1);
          console.log(arr2); //输出得 [2, 5] 和 [2, 4]
          arr2.length > 1 && j != arr2.length - 1 ? arr2[j + 1] -= 1 : '';
          arr2.length - 1 == j && this.setData({
              list2,
          })
      }

由此可得  在碰到需要下标进行运算时候就不要简写了           感谢你的耐心观看   希望对你有所帮助

点赞 3
收藏
评论

7 个评论

  • o0o有脾气的酸奶
    o0o有脾气的酸奶
    2020-05-25

    对于JSON对象和数组对象,都可以使用for(var i in 对象)来遍历

    如果是数组最好使用for(var i = 0;i < 数组.length;i++)遍历,如果使用for(var i in 对象)来遍历,正常情况下不会有问题,但是:

    // 原数组
    a = [1,2,3]
    // for(var i = 0;i < 数组.length;i++)遍历 没问题
    for(var i = 0;i < a.length;i++) console.log(i, a[i])
    // for(var i in 数组)遍历 没问题
    for(var i in a) console.log(i, a[i])
    ======都是下面的预期结果=======
    0                             1
    1                             2
    2                             3
    ===============================
    
    // 有时候为了方便,给它挂载了某个方法或属性,如
    a.__proto__.myFunc = ()=>{}
    a.__proto__.myProperty = 88
    // 打印a还是原数组,没什么区别
    console.log(a) => [1,2,3]
    // for(var i = 0;i < 数组.length;i++)遍历 没问题
    for(var i = 0;i < a.length;i++) console.log(i, a[i])
    
    // for(var i = 0;i < 数组.length;i++)遍历 有问题了
    for(var i in a) console.log(i, a[i])
    ======不是预期结果=======
    0                       1
    1                       2
    2                       3
    myFunc             ()=>{}
    myProperty             88
    =========================
    


    删除数组中的值,可以使用filter 结合 使用 in json对象 的操作符,可以省掉很多代码

    var delIdxs = {2:0, 5:0};
    var delVal = {'王五':0, '刘备':0};
    
    
    var list = ['张三','李四','王五','张飞','关羽','刘备','曹操'];
    // 使用索引删除
    var a = list.filter((v, i)=>!(i in delIdxs))
    // 使用值删除
    var b = list.filter(v=>!(v in delVal))
    console.log(a, b)
    


    若认为该回答有用,给回答者点个[ 有用 ],让答案帮助更多的人

    2020-05-25
    赞同 3
    回复 9
    • o0o有脾气的酸奶
      o0o有脾气的酸奶
      2020-05-25
      如果又要挂载方法或属性,有想使用for(var i in 数组)怎么办呢?
      2020-05-25
      2
      回复
    • 唏嘘
      唏嘘
      2020-07-29回复o0o有脾气的酸奶
      我的天  前排膜拜大佬
      2020-07-29
      回复
    • o0o有脾气的酸奶
      o0o有脾气的酸奶
      2020-07-29回复唏嘘
      你是多久没登社区了?
      2020-07-29
      回复
    • 唏嘘
      唏嘘
      2020-07-29回复o0o有脾气的酸奶
      很久没有登录了
      2020-07-29
      回复
    • o0o有脾气的酸奶
      o0o有脾气的酸奶
      2020-07-29回复唏嘘
      很忙呀
      2020-07-29
      回复
    查看更多(4)
  • 🎣
    🎣
    2020-04-15

    arr2.length > 1 && j != arr2.length - 1 ? arr2[j + 1] -= 1 :'';为什么要有这一步操作

    2020-04-15
    赞同
    回复 1
    • 唏嘘
      唏嘘
      2020-04-15
      判断是不是第一位和最后一位  为了删除哦    因为你删除一个  那么下一个要删除的下标要减去1
      2020-04-15
      回复
  • 风吹屁屁凉
    风吹屁屁凉
    2019-04-26

    用用 map() 会发觉更好用


    2019-04-26
    赞同
    回复
  • Steady
    Steady
    2019-04-19

    有删除的用filter

    2019-04-19
    赞同
    回复 1
    • 唏嘘
      唏嘘
      2020-04-16
      小程序可以用吗
      2020-04-16
      回复
  • 2019-04-16

    for in 是用来遍历对象的  foreach才是遍历数组的

    2019-04-16
    赞同
    回复 1
    • 唏嘘
      唏嘘
      2020-04-16
      是的
      2020-04-16
      回复
  • 画甲
    画甲
    2019-04-16

    你好,我也是做了一个删除功能,数组里的删除了,但是页面上没有及时加载出来,请问这是为什么啊


    2019-04-16
    赞同
    回复 1
    • 唏嘘
      唏嘘
      2020-01-13
      刚刚才看到   现在你应该解决了吧  应该是setData问题
      2020-01-13
      回复
  • 天南地北
    天南地北
    2019-04-13

    for in 一般用于对象的遍历吧,一般遍历数组用的数for

    2019-04-13
    赞同
    回复
登录 后发表内容