如何在数组中查找某一个数据

今天朋友问我一个问题,是这样的:在前端数据里有固定的300个号码(不需要后台传值),是300个中奖用户的手机号,分为一、二、三等奖,现在有一个查询入口,用户可以输入手机号,点击查询按钮后会有相应的提示,如果该手机号不在这300个号码里则提示没有中奖,如果在300个号码当中,就提示用户中了几等奖。

我细思了一下,可以把手机号和对应的几等奖都放在一个数组里,然后去遍历手机号,数据格式如下:

var arr = [
    {"num":"15901906425", "price": "1"},
    {"num":"15901906426", "price": "1"},
    {"num":"15901906427", "price": "2"},
    {"num":"15901906428", "price": "2"},
    {"num":"15901906429", "price": "3"}
]

然后下一步写循环逻辑:

var flag = false;
var el = document.getElementById("btn");
el.addEventListener("click", function(){
    var tel = document.getElementById("tel").value;
    for(var i=0; i<arr.length; i++){
        if(arr[i].num == tel){
            console.log(arr[i].price);
            return false;
        }else{
            flag = false;
        }
    }
    if(!flag){
        console.log("sorry");
    }
}, false);

这里说一下我踩得坑:我一开始使用了$.each(),但它的效率较低,还要jQuery库,不如直接for循环来的痛快。为什么会定义一个flag变量呢,需要注意的是如果不定义一个变量,且else里面的语句写的是 console.log('sorry') ,假设用户输入的号码在第150条数据的位置,那么它会循环149次,也就是说它会console.log()149次‘sorry’,直到遇到相对应的手机号码;那如果在后面再加一句 return false 呢,那也是不可行的,如果号码是第150条数据,那它循环一次之后发现号码不对应,会输入一次'sorry',然后就 return false ,就没有然后了,所以用一个变量flag;还是刚刚那个设想,那么它在循环的时候会被赋值149次 false ,但不会影响正常的数据输出,直到对应的数据出现,就没有 flag 什么事了;假设用户输入的号码没有在这300个号码当中,它会循环300次,flag 也被赋值 false 300次,然后 flag 等于 false,于是下面再来一个判断,如果 flag 的值等于 false ,就打印出'sorry'。

虽然上面解释了一大通,但其实几句代码还是很好理解的,还有一种办法不用循环就可以得到一样的效果,但也不好理解。

posted @ 2017-08-04 23:17  幽影一殇  阅读(1600)  评论(0编辑  收藏  举报