最近项目有个地址白名单弹窗显示的需求,如果用户选取的地址不在白名单内就弹窗提示客户。一开始觉得这是一个非常简单需求,只要使用for循环判断一下客户所选地址的城市代码在不在白名单城市代码内就行了,不在就弹窗提示客户所选地址不在白名单内。
以下是白名单(数组对象):
cityList = [
{
cityCode :"A350500000",
provinceCode : "A350000000"
}
]
以下是for循环的代码:
/*
* sendCityCode 为客户所选城市编码
*/
for (var i=0; i<cityList.length; i++) {
if(cityList[i].cityCode != sendCityCode){
console.log(“所选地址不在白名单内”)
}
}
这么写法,当白名单城市为一个的时候是没有问题,但是如果白名单城市大于1个时,因为所选地址是有且只有一个,所以for循环一定会触发if的条件语句,这样会照成不管你选哪里,白名单一定会触发的死结。
所以使用for循环匹配的思路明显不符合此时的需求,后来转变思路:只要所选地址能与白名单的地址中的某一个匹配就行,也就是我要在白名单对象的地址编码属性值找到客户所选的地址编码。
此时白名单城市列表为:
cityList = [
{
cityCode :"A350500000",
provinceCode : "A350000000"
},
{
cityCode :"A361100000",
provinceCode : "A360000000"
}
]
处理方法:
var arr= cityList.filter(function(item){
return item.cityCode == sendCityCode;
})
//注意,得到的arr也是一个数组对象,所以只需要判断一下数组的长度不为0,就知道客户所选地址编码在不在白名单编码内了
if(arr.length==0){
console.log(“所选地址不在白名单内”)
}
这里所用的是filter方法:
filter() 方法将匹配元素集合缩减为匹配指定选择器的元素.该方法不改变原数组,返回的是筛选后满足条件的数组.
以上基本完成了需求。