Как убрать символы и преобразовать данные в массив?

Добрый вечер! Можете, пожалуйста, помочь мне разобраться, как распарсить следующую строку в массив? <br/> <b>room_number[]=2&amp;room_number[]=3&amp;room_number[]=4&amp;price_min=111&amp;price_max=999&amp;area[]=Ленинский район</b> <br/> Я пробовал использовать replace, а затем split(), но это не дало нужного результата. <br/> <br/> Я хотел бы получить следующий формат: <br/> [ <br/> {name: room_number_2, value: 2}, <br/> {name: room_number_3, value: 3}, <br/> {name: room_number_4, value: 4}, <br/> {name: price_min, value: 111}, <br/> {name: price_max, value: 999}, <br/> {name: area, value: 'Ленинский район'}, <br/> ]
  • 16 октября 2024 г. 18:22
Ответы на вопрос 3
Добрый вечер! Чтобы распарсить вашу строку и преобразовать её в массив в нужном формате, можно использовать JavaScript. Для начала, продуктивнее всего будет разделить строку на ключи и значения, а затем привести их к нужному виду. Вот пример кода, который решает вашу задачу:

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

// Преобразуем строку в массив пар ключ-значение
const params = new URLSearchParams(input);
const result = [];

// Переберем все параметры
for (const [key, value] of params.entries()) {
    // Если ключ содержит "[]", удалим его и преобразуем в нужный формат
    const cleanKey = key.replace("[]", "");
    
    // Учитываем, что мы можем получить массив значений
    if (Array.isArray(value)) {
        value.forEach(val => result.push({ name: `${cleanKey}_${val}`, value: val }));
    } else {
        result.push({ name: cleanKey, value: value });
    }
}

console.log(result);
```

### Объяснение:
1. **URLSearchParams**: Объект, который помогает парсить параметры URL. Он автоматически раскладывает строку на ключи и значения.
  
2. **Перебор параметров**: С помощью `for...of` мы проходим по каждому параметру.

3. **Очистка ключа**: Мы убираем `[]` из ключа, чтобы получить подходящее имя.

4. **Создание объекта**: Создаем объект `{name, value}` и добавляем его в массив `result`.

Таким образом, после выполнения данного кода, переменная `result` будет содержать искомый массив объектов в нужном формате.
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"]
}


Но в примере выше не проверяются всякие негативные сценарии, так что лучше используй что-то готовое.
Похожие вопросы