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 メソッドを使用できます(ただし、レガシー環境では shim が必要になる場合があります)。

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?実装を使用)

さらに短い条件については、正規表現 (アンカー代替)に頼ることもできます。

if (/^ba(1 | 2|3 )/i.test(string)) { … }
于 2013-09-18T14:30:12.843 に答える
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',
    ...
};

郵便番号の右側から連続する文字を取り出し、一致するまでテーブル内で簡単な検索を行います。4 行ほどのコードでそれを行う必要があります。

function getCounty(str) {
    while (str.length) {
        var res = countyMapping[str];
        if (res !== undefined) return res;
        str = str.slice(0, -1);
    }
}

最初に文字列を正規化して、郵便番号の 2 つの半分の間にスペースが存在し、適切な場所にあることを確認することをお勧めします。

追加のボーナス ポイントを得るには、データベースからテーブルを取得して、スコットランドが英国から放り出されたときにコードを変更する必要がないようにします;-)

于 2013-09-18T14:56:50.247 に答える