Задать вопрос
Dier_Sergio_Great
@Dier_Sergio_Great
Увлеченный человек

Как конвертировать массив полей FORM/формы в массив полей объекта JS?

<form id=data ... >
<input name=list[label][]  value=Машина>
<input name=list[label][]  value=Дом>
<input name=list[cost][]  value=123>
<input name=list[cost][]  value=321>
</form>

закидываю форму в FormData Объект и получаю имена полей не как массив, а как строки.
fd = new FormData(document.getElementById(data));
console.log(fd);

0: "list[label][]" → "Машина"​​
1: "list[cost][]" → "123"​​
2: "list[label][]" → "Дом"​​
3: "list[cost][]" → "321"​​

Мы видим что каждое второе значение имеет одинаковый ключ.
let data = {}
fd.forEach((value, key) => data[key] = value);
console.log(data );

То получаем всего 2 значения в объекте DATA
data {
0: "list[label][]" → "Дом"
1: "list[cost][]" → "321"
}

Как сделать чтобы объект data содержал все значения полей с нумерованными ключами?
как это получается по аналогии на PHP $_GET[list][label][0] и $_GET[list][label][1]т.е. по нумерованному ключу массива можно получить значения а не в виде строки.
  • Вопрос задан
  • 67 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const getFormData = form =>
  Array.prototype.reduce.call(
    form.elements,
    (acc, n) => {
      const isCheckbox = n.type === 'checkbox';
      const isRadio = n.type === 'radio';
      const keys = Array.from(n.name.matchAll(/\w+|\[(\w*)\]/g), n => n[1] ?? n[0]);
      const key = isCheckbox ? null : keys.pop();
      const isArr = !key;
      const values = keys.reduce((p, c, i, a) => {
        return p[c] ??= (-~i === a.length && isArr ? [] : {});
      }, acc);

      if (!isCheckbox || n.checked) {
        values[isArr ? values.length : key] ??= !isRadio || n.checked ? n.value : null;
      }

      return acc;
    },
    {}
  );

https://jsfiddle.net/a9bctor5/
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
17 янв. 2025, в 20:50
15000 руб./за проект
17 янв. 2025, в 19:29
20000 руб./за проект
17 янв. 2025, в 18:09
5000 руб./за проект