我在这里发现了一些类似问题的帖子,但与我的尝试并不完全相同。我目前正在使用一个简单的if语句来检查用户输入的数据,然后检查它是否以许多不同的值开头。我这样做有以下几点:
var value = string;
var value = value.toLowerCase();
country = "NONE";
county = "NONE";
if (value.indexOf('ba1 ') == 0 || value.indexOf('ba2 ') == 0 || value.indexOf('ba3 ') == 0) { //CHECK AVON (MAINLAND UK) UK.AVON
country = "UK";
county = "UK.AVON";
} else if(value.indexOf('lu') == 0){//CHECK BEDFORDSHIRE (MAINLAND UK) UK.BEDS
country = "UK";
county = "UK.BEDS";
}
我有大约20-30个不同的if,else语句基本上检查输入的邮政编码并找到相关的县。然而,其中一些if语句非常长,所以我想将值存储在数组中,然后在if语句中只需检查每个数组值的value.indexOf()
。
所以在上面的例子中,我将为语句提供如下数组:
var avon = new Array('ba1 ','ba 2','ba3 ');
然后在indexOf()
内使用每个值
使用最少的脚本是否可以实现这一点,还是我需要为此设置一个功能?理想情况下,我希望将数组保留在if语句中,而不是查询每个数组值。
答案 0 :(得分:2)
您可以使用some
Array method(尽管您可能需要为旧版环境填充它):
var value = string.toLowerCase(),
country = "NONE",
county = "NONE";
if (['ba1 ','ba 2','ba3 '].some(function(str) {
return value.slice(0, str.length) === str;
})) {
country = "UK";
county = "UK.AVON";
}
(使用更高效的How to check if a string "StartsWith" another string?实现)
对于更短的情况,您也可以使用正则表达式(anchor和alternation):
if (/^ba(1 | 2|3 )/i.test(string)) { … }
答案 1 :(得分:0)
不,它不存在,但你可以做一个函数来做到这一点:
function containsAny(string, substrings) {
for(var i = 0; i < substrings.length; i++) {
if(string.indexOf(substrings[i]) !== -1) {
return true;
}
}
return false;
}
或者,有一个正则表达式:
/ba[123] /.test(value)
答案 2 :(得分:0)
我的推荐是重新思考你的方法并使用正则表达式而不是indexOf。
但如果您确实需要它,可以使用以下方法:
function checkStart(value, acceptableStarts){
for (var i=0; i<acceptableStarts.length; i++) {
if (value.indexOf(acceptableStarts[i]) == 0) {
return true;
}
}
return false;
}
您之前的用法变为:
if (checkStart(value, ['ba1', ba2 ', 'ba3'])) {
country = 'UK';
}
更好的是你可以概括一些东西,比如:
var countryPrefixes = {
'UK' : ['ba1','ba2 ', 'ba3'],
'FR' : ['fa2','fa2']
}
for (var key in countryPrefixes) {
if (checkStart(value, countryPrefixes[key]) {
country = key;
}
}
答案 3 :(得分:0)
我忘了使用硬编码逻辑,只使用数据:
var countyMapping = {
'BA1': 'UK.AVON',
'BA2': 'UK.AVON',
'BA3': 'UK.AVON',
'LU': 'UK.BEDS',
...
};
从邮政编码的右侧取下连续的字符,然后在表格中进行简单的查找,直到获得匹配为止。四行左右的代码应该这样做:
function getCounty(str) {
while (str.length) {
var res = countyMapping[str];
if (res !== undefined) return res;
str = str.slice(0, -1);
}
}
我建议首先对字符串进行规范化,以确保邮政编码的两半之间的空间存在并位于正确的位置。
要获得额外奖励积分,请从数据库中取出表格,这样当苏格兰被抛出离开英国时,您无需修改代码; - )