#javascript #url
#javascript #url
Вопрос:
У меня есть такие строки-
countries=a,bamp;states=c,damp;districts=e,f,g,h
countries=a,b
Я хочу извлечь часть строки, которая находится между символами =
, amp;
и вернуть результат в виде массива. Итак, в первом случае результат должен быть ['a','b', 'c','d','e','f','g','h']
. Во втором случае это должно быть ['a','b']
. Я добился результата, поступив следующим образом-
const extract = string.split('amp;');
const splitArray = extract.map(x => x.split('=')[1]);
const resultString = splitArray.join(',');
const result = resultString.split(',');
Могу ли я сделать это более лаконично и лучше?
Ответ №1:
Один из примеров использования URLSearchParams
let query = 'countries=a,bamp;states=c,damp;districts=e,f,g,h';
let values = [];
(new URLSearchParams(query)).forEach(function(v) {
v.split(',').forEach(function(v){
values.push(v);
});
});
console.log(values); // ["a", "b", "c", "d", "e", "f", "g", "h"]
… но если под «кратким» вы подразумеваете «однострочный» .. ну, вот мое мнение:
let query = 'countries=a,bamp;states=c,damp;districts=e,f,g,h';
query = query.replace(/(^|amp;).*?=/g,',').split(',').filter(Boolean);
console.log(query); // ["a", "b", "c", "d", "e", "f", "g", "h"]
Ответ №2:
const input = [
'countries=a,bamp;states=c,damp;districts=e,f,g,h',
'countries=a,b'
];
input.forEach((line) => {
let result = [].concat.apply([], line
.split(/amp;/)
.map((keyValue) => {
return keyValue.replace(/^[^=]*=/, '').split(/,/)
}));
console.log(line ' ==> ' JSON.stringify(result));
});
Вывод:
countries=a,bamp;states=c,damp;districts=e,f,g,h ==> ["a","b","c","d","e","f","g","h"]
countries=a,b ==> ["a","b"]
Объяснение:
- разделите на
amp;
, чтобы получить пары ключ / значение - для каждого ключа / значения:
- извлечение значения
- разделите значение на
'
- сгладьте результирующий массив массивов с помощью
[].concat.apply([], arr)
В качестве альтернативы вы можете инициализировать пустой массив []
и в качестве последнего шага для каждого ключа / значения выполнить forEach для каждого элемента и поместить его в массив.