Как разделить строку, разбивая её по определенному символу?
Описание проблемы
У меня есть следующая строка:
'john smith~123 Street~Apt 4~New York~NY~12345'
Используя JavaScript, как наиболее быстрым способом разобрать эту строку на отдельные элементы? Я хочу получить переменные вида:
var name = "john smith";
var street = "123 Street";
var apartment = "Apt 4";
var city = "New York";
var state = "NY";
var zipCode = "12345";
Каков оптимальный подход для достижения этого результата?
5 ответ(ов)
В соответствии с ECMAScript 6 (ES6
), чистым способом обработки массивов является деструктуризация:
const input = 'john smith~123 Street~Apt 4~New York~NY~12345';
const [name, street, unit, city, state, zip] = input.split('~');
console.log(name); // john smith
console.log(street); // 123 Street
console.log(unit); // Apt 4
console.log(city); // New York
console.log(state); // NY
console.log(zip); // 12345
Если у вас могут быть дополнительные элементы во входной строке, вы можете использовать оператор rest
, чтобы получить массив оставшихся элементов или просто игнорировать их:
const input = 'john smith~123 Street~Apt 4~New York~NY~12345';
const [name, street, ...others] = input.split('~');
console.log(name); // john smith
console.log(street); // 123 Street
console.log(others); // ["Apt 4", "New York", "NY", "12345"]
Я предположил, что значения являются неизменяемыми, и использовал объявление const
.
Наслаждайтесь ES6!
Вам не нужен jQuery.
Вы можете использовать стандартные методы JavaScript для работы со строками. В приведённом примере используется метод split
, который разбивает строку s
на массив fields
по разделителю ~
.
Вот как это работает:
var s = 'john smith~123 Street~Apt 4~New York~NY~12345';
var fields = s.split(/~/); // Разбиваем строку на массив по символу ~
var name = fields[0]; // Первое поле - имя
var street = fields[1]; // Второе поле - улица
console.log(name); // Выводит: john smith
console.log(street); // Выводит: 123 Street
Таким образом, вы получаете необходимые значения, не прибегая к jQuery.
Вы можете использовать следующий подход, несмотря на то что он не самый простой:
var addressString = "~john smith~123 Street~Apt 4~New York~NY~12345~",
keys = "name address1 address2 city state zipcode".split(" "),
address = {};
// Очищаем строку с помощью первого замещения
// Используем второе замещение для сопоставления ключей с найденными значениями
addressString.replace(/^~|~$/g, '').replace(/[^~]+/g, function(match){
address[keys.shift()] = match;
});
// Теперь объект адреса будет содержать соответствующие значения
address = {
address1: "123 Street",
address2: "Apt 4",
city: "New York",
name: "john smith",
state: "NY",
zipcode: "12345"
}
Обновление для ES2015 с использованием деструктуризации
const [name, address1, address2, city, state, zipcode] = addressString.match(/[^~]+/g);
// Теперь переменные содержат соответствующую информацию:
console.log(name, address1, address2, city, state, zipcode);
// -> john smith 123 Street Apt 4 New York NY 12345
Это альтернативный способ, который можно использовать для обработки этой строки адреса.
Если разделитель найден, то строка будет разделена, в противном случае будет возвращена та же строка.
Вот пример функции на JavaScript, которая реализует данное поведение:
function SplitTheString(ResultStr) {
if (ResultStr != null) {
var SplitChars = '~';
if (ResultStr.indexOf(SplitChars) >= 0) {
var DtlStr = ResultStr.split(SplitChars);
var name = DtlStr[0]; // первое значение до разделителя
var street = DtlStr[1]; // второе значение после разделителя
return { name, street }; // возвращаем объект с извлечёнными значениями
}
}
return ResultStr; // возвращаем ту же строку, если разделитель не найден
}
В этом коде, если строка ResultStr
не равна null
и содержит символ разделителя ~
, она будет разделена на два элемента — name
и street
. Если разделитель не найден, функция вернёт оригинальную строку.
Самый простой способ сделать это будет примерно так:
var address = theEncodedString.split(/~/);
var name = address[0], street = address[1];
Таким образом, вы можете разделить закодированную строку на составляющие, используя символ ~
в качестве разделителя.
Разделить массив на части
Как преобразовать строку, разделённую запятыми, в массив?
Как разделить строку с несколькими разделителями в JavaScript?
Существует ли ссылка на "последнюю" библиотеку jQuery в Google APIs?
Как создать диалог с кнопками "Ок" и "Отмена"