Javascript — извлечение части строки, лежащей между двумя специальными символами

#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 для каждого элемента и поместить его в массив.