1

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

4 回答 4

2

您可以使用someArray 方法(尽管您可能需要为遗留环境填充它):

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? implementation also)

对于更短的条件,您还可以求助于正则表达式(锚点交替):

if (/^ba(1 | 2|3 )/i.test(string)) { … }
于 2013-09-18T14:30:12.843 回答
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)
于 2013-09-18T14:28:52.677 回答
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;
  }
}
于 2013-09-18T14:29:23.337 回答
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);
    }
}

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

要获得额外的奖励积分,请将表格从数据库中取出,这样当苏格兰被赶出英国时,您不必修改代码;-)

于 2013-09-18T14:56:50.247 回答