Как преобрзовать данный формы в объект js?

Сабж.

Вдруг понял что до сих пор не знаю универсального работающего решения.
Просто взять форму и просто получить объект с данными из этой формы.

К примеру есть форма:
<form>
    <label>
        <input type="text" name="GROUP1[NAME]">
    </label>
    <label>
        <input type="text" name="GROUP2[EMAIL]">
    </label>
    <label>
        <input type="text" name="GROUP2[PHONE]">
    </label>
    <label>
        <input type="text" name="GROUP2[CITY]">
    </label>
    <label>
        <textarea type="text" name="GROUP1[TEXT]"></textarea>
    </label>
</form>

Хочу получить на выходе:
{
    GROUP1 {
        NAME: 'значение',
        TEXT: 'значение'
    },
    GROUP2 {
        EMAIL: 'значение',
        PHONE: 'значение',
        CITY: 'значение'
    },
}


Не url кодаированную строку, не FormData, не плоский список, а просто объект который я могу бы получить скажем из массива $_POST на сервере.

Никак?
  • Вопрос задан
  • 79 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
[...document.querySelectorAll('form [name]')].reduce((obj, el) => {
  const path = el.name.match(/\w+/g);
  const key = path.pop();
  path.reduce((acc, n) => acc[n] ||= {}, obj)[key] = el.value;
  return obj;
}, {})
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
yarkov
@yarkov Куратор тега JavaScript
Проект "Жизнь после смерти" - lifeafterdeath.ru
Если просто, то вот так:
const form = document.querySelector('form');
const data = new FormData(form);

for (let entry of data) {
	console.log(entry);
}
Ответ написан
@zkrvndm
Боты, парсеры, расширения
Если на сайте есть jQuery то ваша проблема решается в одну строку:
https://api.jquery.com/serializeArray/

Функция serializeArray делает из формы объект:
$('form').serializeArray(); // Вытащит данные из формы в виде объекта
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Artezio Нижний Новгород
от 130 000 до 180 000 ₽
Artezio Москва
от 160 000 до 220 000 ₽
Artezio Витебск
от 2 800 до 3 300 $