Помогите разобрать строку (Город, Штат Zip) с JavaScript - PullRequest
5 голосов
/ 24 февраля 2011

У меня есть строка в следующем формате:

Город, штат ZIP

Я бы хотел получить город и штат из этой строки.

Как я могу сделать это с помощью JavaScript? edit: обратите внимание, что он не упоминает, что у него уже есть почтовый индекс, когда он добирается сюда, если это поможет вам в вашем решении ~~ drachenstern

Ответы [ 5 ]

10 голосов
/ 24 февраля 2011
var address = "San Francisco, CA 94129";

function parseAddress(address) {
    // Make sure the address is a string.
    if (typeof address !== "string") throw "Address is not a string.";

    // Trim the address.
    address = address.trim();

    // Make an object to contain the data.
    var returned = {};

    // Find the comma.
    var comma = address.indexOf(',');

    // Pull out the city.
    returned.city = address.slice(0, comma);

    // Get everything after the city.
    var after = address.substring(comma + 2); // The string after the comma, +2 so that we skip the comma and the space.

    // Find the space.
    var space = after.lastIndexOf(' ');

    // Pull out the state.
    returned.state = after.slice(0, space);

    // Pull out the zip code.
    returned.zip = after.substring(space + 1);

    // Return the data.
    return returned;
}

address = parseAddress(address);

Это, вероятно, лучше, чем использование регулярных выражений и String.split (), поскольку учитывается, что в штате и городе могут быть пробелы.

РЕДАКТИРОВАТЬ: Исправление ошибки: Включено толькоПервое слово из нескольких слов имен состояний.

А вот сокращенная версия.: D

function parseAddress(a) {if(typeof a!=="string") throw "Address is not a string.";a=a.trim();var r={},c=a.indexOf(',');r.city=a.slice(0,c);var f=a.substring(c+2),s=f.lastIndexOf(' ');r.state=f.slice(0,s);r.zip=f.substring(s+1);return r;}
2 голосов
/ 24 февраля 2011

Есть много способов сделать это.Вот очень наивный:

var parts = "City, State ZIP".split(/\s+/); // split on whitespace
var city = parts[0].slice(0, parts[0].length - 1); // remove trailing comma
var state = parts[1];
var zip = parts[2];

Вот тот, который объясняет наличие пробелов в городе или штате или в обоих:

var parts = "san fran bay, new mex state 666666".split(/\s+|,/),
    partition = parts.indexOf(""),
    city = parts.slice(0, partition).join(" "),
    state = parts.slice(partition + 1, -1).join(" "),
    zip = parts.pop();

Последний работает только если выНам повезло оказаться в среде, которая поддерживает деструктурирующее назначение :

var city, statezip, state, zip, parts;
[city, statezip] = "Spaced City, New Mexico ZIP".split(/,\s*/);
parts = statezip.split(/\s+/);
zip = parts.pop();
state = parts.join(" ");

Конечно, ни один из них не выполняет никакой проверки.

1 голос
/ 24 февраля 2011

Хорошо, так как советовать регулярное выражение не очень хорошо, вот мое решение. Он учитывает города, в которых есть пробелы, а другие ответы здесь, кажется, не делают:

    var str = "New York, NY 20101";
    var cityAndRest = str.split(',');
    var city = cityAndRest[0];
    var stateAndZip = cityAndRest[1].trim().split(' ');
    var state = stateAndZip[0];
    var zip = stateAndZip[1];
0 голосов
/ 24 февраля 2011

Первое предположение: только американские адреса.

Сначала выясните, являются ли последние 5 или последние 10 символов числовыми.Проще проверить, является ли последний символ числовым.Если это так, то, вероятно, он включает почтовый индекс.Затем простой тест, чтобы увидеть, содержит ли последние 10 пробел (city #####) или последние десять содержат тире (12345-6789), чтобы выяснить, является ли это 5 или 5 + 4 zip.Мы проверим на дефис и без пробела.(city-du-lac 12345 захватывает -lac 12345)

Далее все адреса разделяют город и штат через запятую, поэтому нам нужна последняя запятая.Найдите индекс последней запятой и разделите ее там.Я не знаю города, который использует запятые в своем названии, и я уверен, что не позволю моему парсеру разразиться неизвестным, если я смогу помочь ему.Я игнорирую тот факт, что Washington DC также может быть Washington, DC.Я считаю, что крайние случаи предназначены для библиотек, а не для одного сценария.

Наконец, обрежьте все, что осталось, чтобы удалить конечные или начальные пробелы.

function IsNumeric(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

var addr = 'New York City, New York 10101';
//var addr = 'San Bernadino, CA 11111';
function getCityStateZip(addr){
  var city; var state;var zip;
  city = ''; state = ''; zip = '';
  var addrLen = addr.length;
  if ( IsNumeric( addr.substring(addrLen - 1) ) ) {
    //contains a zipcode - just a sanity check
    //get last 10 characters for testing easily
    var lastTen = addr.substring( addrLen - 10 );
    if ( lastTen.indexOf('-') > 0 && ( lastTen.indexOf(' ') == -1 ) ) {
      //found a hyphen and no space (matches our complex rule for zipcodes)
      zip = lastTen;
    } else {
      zip = addr.substring( addrLen - 5 ); //assume a basic 5 zip code
    }
  }
  var zipLen = zip.length;
  addrLen = addrLen - zipLen - 1;
  addr = addr.substring(0, addrLen ); //remove the chars we just moved into zip

  var lastComma = addr.lastIndexOf(',');
  if ( lastComma == -1 ) {
    //you have a problem, how do you want to handle it?
  }
  city = addr.substring(0,lastComma); //skip the comma itself, yes?
  state = addr.substring(lastComma + 2);
  return { 'city':city,'state': state,'zip': zip};
}

getCityStateZip(addr)

IsNumeric Функция js может быть найдена здесь Проверка десятичных чисел в JavaScript - IsNumeric ()

0 голосов
/ 24 февраля 2011

Для этого типа вещей вы можете использовать функции JavaExcripts RegEx.

Вот некоторая информация:

http://www.javascriptkit.com/javatutors/re.shtml

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...