开关门

说一个简单的开关门案例,也是我们常在做购物车时会遇到的,就比如说全选反选啊,等等等等

首先,如果你要判断一件商品你是否加入过购物车,那普通的思路肯定是用if...else来判断那么是这样的

var arr = [
        {id:1,num:3},
        {id:2,num:5},
        {id:3,num:7},
        {id:4,num:8}
    ]
    var id = 6;
    for(var i=0;i<arr.length;i++){
        if(arr[i].id==id){
            alert('以前有这个商品,数量相加')
        }else{
            alert('以前没有,把新商品加入')
        }
    }

那么他的执行结果是这样的

为什么重复加入了4次呢?if...else就是如果这个条件不满足,则去执行下面的代码,所以就是无论我们要加入的id是什么,执行的次数只会是数组的长度,也就是说,循环遍历多少次,就会去执行多少次,那么大家想一下,这样你在往购物车加入商品的话,是不是会造成商品一直在重复加入呢,那人家买东西岂不亏死喽。

如果你还觉得不明白 我们再来看一个案例

  var arr = [1,2,3]
   for(var i=0;i<arr.length;i++){
        if(arr.length<30){
            arr.push(1)
        }
        console.log(arr)
   }

  这里是执行结果

是不是执行了30次呢,就像上面一样,它每次循环执行的都是最新的arr。

所以,这里我们就需要用到开关门了。我对他的理解呢就是 要么...要么....

  var arr = [
        {id:1,num:3},
        {id:2,num:5},
        {id:3,num:7},
    ]
    var id = 6;
    var bStop = true;//开门
    for(var i=0;i<arr.length;i++){
        if(arr[i].id==id){
            alert('以前有这个商品,数量相加')
            bStop = false;//关门
            break
        }
    }
    //开门则执行 关门则不执行
    if(bStop){
        alert('以前没有,新插入一个对象')
    }

  就是无论你的id多少,数组长度数多少,它永远只执行一次操作,这样才会使得我们不管这件商品是否加入过购物车,只要我们点击几次,加入的商品数量只会与之相符,并不会造成循环多次,把以前加入过的商品都算在新加入的数量上面,造成数量上的冗余与错误。

 

是不是判断以前没有这个商品,那么就点击了一次 所以只加入一个,这样是不是更合理一点呢。

                                                                                                                                                                      
                                                                                                                                                                                          (ps:如有不同意见,欢迎指正)

 

posted on 2018-07-05 11:10  崔崔崔  阅读(153)  评论(1编辑  收藏  举报

导航