Здравствуйте. Как правильно изменить функцию конвертации строки в объект, чтобы получить массив всех значений?
Для извлечения объекта из строки запроса (query string) с определенной структурой можно воспользоваться следующим подходом: 1. Сначала разделить строку запроса на отдельные параметры и их значения, используя символы "?" для разделения параметров и "&" для разделения значений. Пример строки запроса: "param1=value1¶m2=value2¶m3=value3" 2. Затем разделить каждую пару параметр=значение на две отдельные строки, используя метод split('='). 3. Создать объект, в котором ключами будут параметры, а значениями - соответствующие им значения. Пример: ```javascript function parseQueryString(queryString) { const paramsArray = queryString.split('&'); const obj = {}; paramsArray.forEach(param => { const [key, value] = param.split('='); if (obj[key]) { if (Array.isArray(obj[key])) { obj[key].push(value); } else { obj[key] = [obj[key], value]; } } else { obj[key] = value; } }); return obj; } const queryString = "param1=value1¶m2=value2¶m3=value3¶m1=value4"; const parsedObject = parseQueryString(queryString); console.log(parsedObject); ``` В этом примере функция parseQueryString преобразует строку запроса в объект, в котором параметры "param1" и "param2" имеют по одному значению, а параметр "param3" имеет своё значение. Кроме того, параметр "param1" повторяется дважды, поэтому его значение будет массивом из двух значений. Для получения массива всех значений одного параметра можно модифицировать функцию parseQueryString, как показано в коде выше.
Просто исправить существующий код:
- 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 ), {});