Как мне преобразовать все элементы моей формы в объект JavaScript?
Я хотел бы иметь какой-то способ автоматического создания объекта JavaScript из моей формы, без необходимости циклически перебирать каждый элемент. Я не хочу, чтобы строка возвращалась $('#formid').serialize();
, и при этом я не хочу, чтобы карта возвращалась$('#formid').serializeArray();
javascript
jquery
json
serialization
Yisroel
источник
источник
Ответы:
serializeArray
уже делает именно это. Вам просто нужно втирать данные в нужный вам формат:Остерегайтесь скрытых полей, имена которых совпадают с реальными входными данными, поскольку они будут перезаписаны.
источник
$.map( $("#container :input"), function(n, i) { /* n.name and $(n).val() */ } );
если вам нужно включить отключенные элементы.foo[bar]
входные данные -типа, как ожидалось, не говоря уже о большинстве других разновидностей входных имен. Будучи очень разочарованным мелкими решениями этой проблемы, я закончил тем, что написал свой собственный плагин jQuery - подробности в ответе, который я предоставил на этот вопрос.Конвертировать формы в JSON как босс
Текущий источник находится на GitHub и Bower .
Следующий код устарел .
Следующий код может работать со всеми видами входных имен; и обращаться с ними так, как вы ожидаете.
Например:
Применение
Колдовство (JavaScript)
источник
<select name="foo" multiple="multiple">
не будет работать в любом сценарии. Однако, если вы используете[]
, как в<select name="bar[]" multiple="multiple">
, он будет работать просто отлично :)Что случилось с:
источник
.each
вместо.map
??var form = {}; $.each($(this).serializeArray(), function (i, field) { form[field.name] = field.value || ""; });
$(this).serializeArray().reduce(function(m,o){ m[o.name] = o.value; return m;}, {})
Фиксированная версия решения Тобиаса Коэна. Это правильно обрабатывает ложные значения, такие как
0
и''
.И версия CoffeeScript для вашего удобства кодирования:
источник
value = @value ? ''
keyMap
и следующую строку:key = if keyMap? then keyMap(@name) else @name
. Теперь вы можете передать функцию отображения, как(name) -> name.match(/\[([^\]]+)]/)[1]
. И тогда можно было бы необходимо изменить все последующие@name
доkey
, конечноpost
, вы можете просто сделать$('form').serializeObject().post
. Нет необходимости в фантазии карт.if (!objectData[this.name].push)
??objectData[this.name]
есть ли метод push (грубо говоря, массив). Если это массив, он выталкивает значение, если это не массив, он преобразует его в массив, так что несколько значений с одним и тем же ключом будут объединены в массив.Мне нравится использовать,
Array.prototype.reduce
потому что это однострочный, и он не полагается на Underscore.js или тому подобное:Это похоже на использование ответа
Array.prototype.map
, но вам не нужно загромождать свою область дополнительной переменной объекта. Шоппинг с одной остановкой.ВАЖНОЕ ПРИМЕЧАНИЕ . Формы с входными данными, которые имеют повторяющиеся
name
атрибуты, являются допустимым HTML и фактически являются распространенным подходом. Использование любого из ответов в этой теме в этом случае будет неуместным (поскольку ключи объектов должны быть уникальными).источник
array.prototype.reduce()
он недоступен в IE8, поскольку он является частью спецификации ECMAScript 5. Так что, если вам нужна поддержка IE8, вы захотите использовать полифилл или другое решение в целом.Все эти ответы показались мне такими невероятными. Есть что-то, что нужно сказать для простоты. Пока все входные данные формы имеют установленный атрибут имени, это должно работать только Джим Денди.
источник
Там действительно нет способа сделать это без изучения каждого из элементов. Что вы действительно хотите знать, так это «кто-то другой уже написал метод, который преобразует форму в объект JSON?» Должно работать что-то вроде следующего - обратите внимание, что оно даст вам только те элементы формы, которые будут возвращены через POST (должно иметь имя). Это не проверено .
источник
Если вы используете Underscore.js, вы можете использовать относительно лаконично:
источник
Я проверил, что есть проблема со всеми другими ответами, что если входное имя в виде массива, например
name[key]
, оно должно быть сгенерировано следующим образом:name:{ key : value }
Например: если у вас есть HTML-форма, аналогичная приведенной ниже:
Но он должен быть сгенерирован так же, как JSON ниже, и не становится объектом, подобным следующему со всеми остальными ответами. Так что, если кто-то хочет привести что-то вроде следующего JSON, попробуйте код JS ниже.
источник
eval
не должен использоваться таким образом, потому чтоeval
, при использовании таким образом, продвигает ужасно ненадежные, ошибочные, плохо работающие и потенциально небезопасные методы.this.c = function(k,v){ eval("c = typeof "+k+";"); if(c == 'undefined') _t.b(k,v);}
является кратким и не объясняющим. Разработчик с меньшим опытом просто скопирует это, не понимая, почему и как это работает.eval()
из своего кода.Хорошо, я знаю, что на этот вопрос уже получен высокий голос, но был задан еще один похожий вопрос недавно , и я тоже был направлен на этот вопрос. Я также хотел бы предложить свое решение, потому что оно предлагает преимущество перед принятым решением: вы можете включить отключенные элементы формы (что иногда важно, в зависимости от того, как функционирует ваш пользовательский интерфейс)
Вот мой ответ на другой ТАК вопрос :
Изначально мы использовали
serializeArray()
метод jQuery , но он не включает отключенные элементы формы. Мы часто отключаем элементы формы, которые «синхронизируются» с другими источниками на странице, но нам все равно необходимо включить данные в наш сериализованный объект. ТакserializeArray()
и вышло. Мы использовали:input
селектор, чтобы получить все входные элементы (как включенные, так и отключенные) в данном контейнере, а затем$.map()
создать наш объект.Обратите внимание, что для того, чтобы это работало, каждому из ваших входных данных потребуется
name
атрибут, который будет именем свойства результирующего объекта.Это на самом деле немного изменилось по сравнению с тем, что мы использовали. Нам нужно было создать объект, который был структурирован как .NET IDictionary, поэтому мы использовали это: (Я предоставляю его здесь на случай, если это будет полезно)
Мне нравятся оба этих решения, потому что они представляют собой простое использование
$.map()
функции, и вы имеете полный контроль над своим селектором (то есть, какие элементы вы в конечном итоге включаете в свой результирующий объект). Кроме того, не требуется дополнительный плагин. Обычный старый jQuery.источник
map
как это создает массив объектов с одним свойством, он не объединяет все свойства в один объект.Эта функция должна обрабатывать многомерные массивы вместе с несколькими элементами с одинаковыми именами.
Я использую его уже пару лет:
источник
Ты можешь сделать это:
Смотрите JSON .
источник
Однострочный (без зависимостей, кроме jQuery), использует фиксированную привязку объекта для функции, переданной
map
методу.Что оно делает?
подходит для прогрессивных веб-приложений (можно легко поддерживать как обычные действия отправки формы, так и запросы ajax)
источник
Использование:
Вывод:
источник
Простота лучше здесь. Я использовал простую строку заменить регулярным выражением, и до сих пор они работали как шарм. Я не эксперт по регулярным выражениям, но держу пари, что вы можете даже заполнять очень сложные объекты.
источник
Из более старого ответа:
источник
serializeArray
вас, поэтому у вас есть свобода выбора любых входов, которые вы хотите (например, вы можете включить отключенные входы), верно? Т.е. это не связано с какой-либо формой или событием отправки, это просто само по себе?reduce
возвращает объект. Это не является независимым, такtoArray
как от jQuery.Я обнаружил проблему с кодом Тобиаса Коэна (у меня недостаточно очков, чтобы прокомментировать его напрямую), который в противном случае работает для меня. Если у вас есть две опции выбора с одним и тем же именем, оба со значением = "", исходный код выдаст "name": "" вместо "name": ["", ""]
Я думаю, это можно исправить, добавив "|| o [this.name] == ''" в первое условие if:
источник
Используя решение Мачека , я изменил его, чтобы он работал так, как ASP.NET MVC обрабатывает свои вложенные / сложные объекты в одной форме. Все, что вам нужно сделать, это изменить часть проверки на это:
Это будет соответствовать, а затем правильно сопоставлять элементы с именами, такими как:
А также
источник
самый простой и точный способ я нашел для этой проблемы заключается в использовании барбекю плагин или это один (что составляет около 0.5K байт размера).
он также работает с многомерными массивами.
источник
Есть плагин, чтобы сделать это для jQuery, jquery.serializeJSON . Я успешно использовал его в нескольких проектах. Работает как часы.
источник
источник
Я предпочитаю такой подход, потому что: вам не нужно перебирать более 2 коллекций, вы можете получить другие вещи, кроме «name» и «value», если вам нужно, и вы можете санировать свои значения перед сохранением их в объекте ( если у вас есть значения по умолчанию, которые вы не хотите хранить, например).
Используйте так:
Только проверено в Firefox.
источник
Превратите что-нибудь в объект (не проверенный на предмет юнитов)
Выход теста:
на
будет давать:
источник
Я нашел проблему с выбранным решением.
При использовании форм с именами на основе массива функция jQuery serializeArray () фактически умирает.
У меня есть PHP-фреймворк, который использует имена полей на основе массива, чтобы позволить одной и той же форме быть размещенной на одной странице несколько раз в нескольких представлениях. Это может быть удобно для добавления, редактирования и удаления на одной странице без конфликтных моделей форм.
Поскольку я хотел разделить формы без необходимости использовать эту абсолютную базовую функциональность, я решил написать свой собственный seralizeArray ():
Обратите внимание: это также работает за пределами формы submit (), поэтому, если в остальной части вашего кода произойдет ошибка, форма не будет отправлена, если вы разместите на кнопке ссылку «сохранить изменения».
Также обратите внимание, что эта функция никогда не должна использоваться для проверки формы только для сбора данных для отправки на сервер для проверки. Использование такого слабого и массово назначенного кода вызовет XSS и т. Д.
источник
В последнее время у меня возникла та же проблема, и я выпустил этот плагин .toJSON jQuery, который преобразует форму в объект JSON с такой же структурой. Это также особенно полезно для динамически генерируемых форм, где вы хотите, чтобы ваш пользователь мог добавлять больше полей в определенных местах.
Дело в том, что вы, возможно, захотите построить форму так, чтобы она имела саму структуру, поэтому предположим, что вы хотите создать форму, в которую пользователь вставляет свои любимые места в городе: вы можете представить, что эта форма представляет
<places>...</places>
элемент XML, содержащий список мест, которым пользователю нравится список<place>...</place>
элементов, каждый из которых содержит, например,<name>...</name>
элемент,<type>...</type>
элемент, а затем список<activity>...</activity>
элементов, представляющих действия, которые вы можете выполнять в таком месте. Итак, ваша XML-структура будет выглядеть так:Как здорово было бы иметь объект JSON из этого, который представлял бы эту точную структуру, так что вы сможете:
Хорошо, теперь нам нужно подумать, как форма может представлять файл XML.
Конечно, это
<form>
тегroot
, но у нас есть тот<place>
элемент, который является контейнером, а не сам элемент данных, поэтому мы не можем использовать входной тег для него.Вот где
<fieldset>
тег пригодится! Мы будем использовать<fieldset>
теги для представления всех элементов контейнера в нашем представлении формы / XML и, таким образом, получим такой результат:Как вы можете видеть в этой форме, мы нарушаем правило уникальных имен, но это нормально, потому что они будут преобразованы в массив элементов, поэтому на них будет ссылаться только их индекс внутри массива.
На этом этапе вы можете увидеть,
name="array[]"
как внутри формы нет одинакового имени, и все красиво, просто и семантически.Теперь мы хотим, чтобы эта форма была преобразована в объект JSON, который будет выглядеть следующим образом:
Для этого я разработал этот плагин jQuery, который кто-то помог оптимизировать в этой ветке Code Review, и выглядит так:
Я также сделал это одно сообщение в блоге, чтобы объяснить это больше.
Это преобразует все в форме в JSON (даже радио и флажки), и все, что вам нужно сделать, это позвонить
Я знаю, что есть много способов конвертировать формы в объекты JSON,
.serialize()
и.serializeArray()
в большинстве случаев они отлично работают и в основном предназначены для использования, но я думаю, что вся идея состоит в том, чтобы написать форму в виде структуры XML со значимыми именами и преобразовать ее в Стоит попробовать правильно сформированный объект JSON , а также тот факт, что вы можете добавлять теги ввода с одинаковыми именами, не беспокоясь, что очень полезно, если вам нужно получить динамически сгенерированные данные форм.Я надеюсь, что это помогает кому-то!
источник
Я сам закодировал форму в многомерный объект JavaScript, чтобы использовать ее в производстве. Результатом является https://github.com/serbanghita/formToObject.js .
источник
Другой ответ
FormData: https://developer.mozilla.org/en-US/docs/Web/API/FormData
источник
[ОБНОВЛЕНИЕ 2020]
С простым oneliner в ванили JS:
источник
Мне нравится версия samuels, но я считаю, что в ней есть небольшая ошибка. Обычно JSON отправляется как
НЕ как
поэтому функция IMO должна читать:
и обернуть его в массив данных (как обычно ожидают тоже) и, наконец, отправить его в виде строки Astring.stringify ({data: App.toJson ('#cropform: input')})
Для stringify взгляда на вопросе 3593046 ненасыщенной версию, в json2.js для каждых-неожиданностей покрытой версии. Это должно покрыть все это :)
источник
Для быстрого и современного решения используйте плагин JSONify jQuery. Приведенный ниже пример дословно взят из GitHub README. Вся заслуга Кушала Панди, автора плагина.
Данный:
Бег:
Производит:
Если вы хотите выполнить JQuery POST с этим объектом JSON:
источник