alkhimik
@alkhimik
Ученик.

Как из query string получить объект следующего вида?

Есть строка в формате query string:

'genre=comedy&year=2023&year=2024&year=2025'

Из нее надо получить объект следующего вида:

{
   genre: [ 'comedy' ],
   year: [ '2023', '2024', '2025' ],
}

Я написал функцию конвертации строки в объект:

function convertQueryStringToObject(str) {
  return str.split("&").reduce((acc, pairs) => {
      const [key, value] = pairs.split("=");
      acc[key] = [value];
      return acc;
  }, {});
}

Результат:

{
  genre: [ 'comedy' ],
  year: [ '2025' ]
}

Как получить массив всех значений?
  • Вопрос задан
  • 121 просмотр
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Просто исправить существующий код:

- acc[key] = [value];
+ (acc[key] ??= []).push(value);

Но можно его ещё и сократить:

const convertQueryStringToObject = str => Array
  .from(new URLSearchParams(str))
  .reduce((acc, n) => ((acc[n[0]] ??= []).push(n[1]), acc), {});

Или неоправданно усложнить и изуродовать:

const convertQueryStringToObject = str => Array
  .from(str.matchAll(/([^&]+)=([^&]+)/g))
  .reduce((acc, [ , k, v ]) => (
    Object.hasOwn(acc, k) || (acc[k] = []),
    acc[k][acc[k].length] = v,
    acc
  ), {});
Ответ написан
yesbro
@yesbro
Думаю, помогаю думать
const convertQueryStringToObject = (paramsString) => {
  const searchParams = new URLSearchParams(paramsString)
  return Array
    .from(new Set(searchParams.keys()))
    .reduce((accumulator, value) => accumulator = {...accumulator, [value]: searchParams.getAll(value)}, {})
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы