Задать вопрос
@aliaksandr-go

Как из строки сделать массив объектов?

Есть строка, например:

room_number[]=2&room_number[]=3&room_number[]=4&price_min=111&price_max=999&area[]=Ленинский район

Надо получить:

[
  { name: 'room_number_2', value: 2 },
  { name: 'room_number_3', value: 3 },
  { name: 'room_number_4', value: 4 },
  { name: 'price_min', value: 111 },
  { name: 'price_max', value: 999 },
  { name: 'area',  value: 'Ленинский район' },
]
  • Вопрос задан
  • 152 просмотра
Подписаться 1 Простой 2 комментария
Решения вопроса 3
alsolovyev
@alsolovyev
¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
const queryString =
  "room_number[]=2&room_number[]=3&room_number[]=4&price_min=111&price_max=999&area[]=Ленинский район"

function convertQueryString(query) {
  const result = []
  const pairs = query.split("&")

  pairs.forEach((pair) => {
    const [name, value] = pair.split("=")
    const cleanName = name.replace(/\[\]/g, "")

    result.push({
      name: cleanName,
      value: decodeURIComponent(value),
    })
  })

  return result
}

const output = convertQueryString(queryString)
console.log(output)


const queryString = "room_number[]=2&room_number[]=3&room_number[]=4&price_min=111&price_max=999&area[]=Ленинский район";

const output = queryString.split('&').map(pair => {
  const [name, value] = pair.split('=')
  return {
    name: name.replace(/\[\]/g, ''),
    value: decodeURIComponent(value),
  }
})

console.log(output)
Ответ написан
Комментировать
Попробуй такое:
function parseQueryString(data) {
  const result = {};
  const pairs = data.split('&').map(x=>x.split('='));
  for(const [name, value] of pairs) {
      const clean_name = name.endsWith('[]') ? name.substr(0, name.length - 2) : name;
      if(!result.hasOwnProperty(clean_name)) {
          result[clean_name] = [];
      }
      result[clean_name].push(value);
  }
  return result;
}


На твоём примере выдаёт такое:
{
  area: ["Ленинский район"],
  price_max: ["999"],
  price_min: ["111"],
  room_number: ["2", "3", "4"]
}


Но в примере выше не проверяются всякие негативные сценарии, так что лучше используй что-то готовое.
Ответ написан
Комментировать
0xD34F
@0xD34F Куратор тега JavaScript
Если отвечать ровно на то, что спрошено, тогда (уродливому результату - уродливый код)

const arr = str.split('&').map(n => (
  n = n.split('='),
  n[1] = isNaN(n[1]) ? n[1] : Number(n[1]),
  ({
    name: n[0].endsWith('[]')
      ? `${n[0].slice(0, -2)}${typeof n[1] === 'number' ? `_${n[1]}` : ''}`
      : n[0],
    value: n[1],
  })
));

Если же обойтись без лютого бреда с подклеиванием числовых значений к имени, то

const arr = Array.from(
  new URLSearchParams(str),
  ([ k, v ]) => ({
    name: k.replace(/\[\]$/, ''),
    value: Number.isNaN(+v) ? v : +v,
  })
);

или (раз уж в тегах присутствуют регулярные выражения, то вот ещё немного хренового кода)

const arr = [...str.matchAll(/([^&]+)=([^&]*)/g)].map(([ , k, v ]) => ({
  name: k.match(/(.*?)(\[\])?$/)[1],
  value: /^-?\d+(\.\d+)?$/.test(v) ? parseFloat(v) : v,
}));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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