说一个简单的开关门案例,也是我们常在做购物车时会遇到的,就比如说全选反选啊,等等等等
首先,如果你要判断一件商品你是否加入过购物车,那普通的思路肯定是用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:如有不同意见,欢迎指正)