Задать вопрос
@ivan_kholodov

Как параметры адресной строки превратить в объект?

Есть строка:

let str = '?name[]=Ivan&name[]=Oleg&page=1&number=5';

Надо из неё получить объект:

{
  name: ['Ivan', 'Oleg'],
  page: 1,
  number: 5
}

Из имени параметра name удалены [], значения собрались в массив.

Пробую примерно так:

const regExp = /\[\]$/;
const paramsName = new URLSearchParams(str);
let result = []
  for (const k of paramsName.keys()) {
      if (regExp.test(k)) {
      let one = paramsName.getAll(k);
      k.replace('[]', '');
      result = [ ...result,
      Object.fromEntries(Object.entries(paramsName).map(([key]) => [key: k, one]))]
    } else {
     	let two = paramsName.get(k);
	result = [...result, 
      Object.fromEntries(Object.entries(paramsName).map(([key]) => [key: k, two]))]
    }
  }
  • Вопрос задан
  • 197 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const obj = [...str.matchAll(/([^?&]+)=([^&]+)/g)]
  .reduce((acc, [ , k, v ]) => (
    k.endsWith('[]')
      ? (acc[k.slice(0, -2)] ??= []).push(v)
      : acc[k] = v,
    acc
  ), {});

или

const params = new URLSearchParams(str);
const reg = /\[\]$/;
const obj = Object.fromEntries(Array.from(
  new Set(params.keys()),
  n => [
    n.replace(reg, ''),
    params[reg.test(n) ? 'getAll' : 'get'](n),
  ]
));

или

const obj = str.split('?').pop().split('&').reduce((acc, n) => {
  let [ k, v ] = n.split('=');
  const isArr = k.slice(-2) === '[]';
  k = k.substring(0, k.length - isArr * 2);
  const target = (isArr ? (acc[k] = acc[k] || []) : acc);
  target[isArr ? target.length : k] = v;
  return acc;
}, {});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы