如果值在下一个数组中的其他数组中,则为Javascript

时间:2013-09-18 14:24:48

标签: javascript jquery

我在这里发现了一些类似问题的帖子,但与我的尝试并不完全相同。我目前正在使用一个简单的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语句中,而不是查询每个数组值。

4 个答案:

答案 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?实现)

对于更短的情况,您也可以使用正则表达式(anchoralternation):

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);
    }
}

我建议首先对字符串进行规范化,以确保邮政编码的两半之间的空间存在并位于正确的位置。

要获得额外奖励积分,请从数据库中取出表格,这样当苏格兰被抛出离开英国时,您无需修改​​代码; - )