Вы можете использовать эмулятор для этого. Взгляните на эту страницу: Android Emulator . Обратите внимание на следующие два аргумента:
-netdelay & lt; delay & gt;
Установите эмуляцию латентности сети на. Значение по умолчанию - нет. См. Таблицу в эмуляции сетевой задержки для поддерживаемых значений. -netspeed & lt; speed & gt;
Установите эмуляцию сетевой скорости в. Значение по умолчанию заполнено. См. Таблицу в эмуляции сетевой скорости для поддерживаемых значений. serializeArray
уже делает именно это. Вам просто нужно массировать данные в требуемый формат:
function objectifyForm(formArray) {//serialize data function
var returnArray = {};
for (var i = 0; i < formArray.length; i++){
returnArray[formArray[i]['name']] = formArray[i]['value'];
}
return returnArray;
}
Следите за скрытыми полями, которые имеют то же имя, что и реальные входы, поскольку они будут перезаписаны.
Мне нравится версия для самуллов, но я считаю, что у нее небольшая ошибка. Обычно JSON отправляется как
{"coreSKU": "PCGUYJS", "name_de": "whatever", ...
НЕ как
[{"coreSKU": "PCGUYJS"}, {"name_de": "whatever"}, ...
, поэтому функция IMO должна читать:
App.toJson = function( selector ) { var o = {}; $.map( $( selector ), function( n,i ) { o[n.name] = $(n).val(); }); return o; }
и обернуть его в массив данных (как и обычно ожидается), и, наконец, отправить его как astring App.stringify ({data: App.toJson ('#cropform: input')} )
Для строкового поиска в вопрос 3593046 для скудной версии, в json2.js для версии, покрываемой каждым событием. Это должно охватывать все это:)
map
, как это создает массив объектов с одним свойством, он не сворачивает все свойства в один объект.
– joshperry
1 October 2010 в 23:46
serializeArray
, поэтому у вас есть свобода выбора любых входных данных, которые вы хотите (например, вы можете включать отключенные входы), правильно? То есть это не связано с какой-либо формой или событием отправки, это просто независимо само по себе?
– dtgq
27 May 2016 в 01:12
reduce
возвращает объект. Это не является независимым, так как toArray
из jQuery.
– juanpastas
27 May 2016 в 15:09
Если вы используете Underscore.js , вы можете использовать относительно краткий:
_.object(_.map($('#myform').serializeArray(), _.values))
Я сам кодировал форму для многомерного объекта JavaScript, чтобы использовать его в процессе производства. Результатом является https://github.com/serbanghita/formToObject.js .
Мне нравится использовать Array.prototype.reduce
, потому что это однострочный, и он не полагается на Underscore.js или тому подобное:
$('#formid').serializeArray()
.reduce(function(a, x) { a[x.name] = x.value; return a; }, {});
Это похоже к ответу с помощью Array.prototype.map
, но вам не нужно загромождать область видимости дополнительной переменной объекта. Одноразовые покупки.
ВАЖНОЕ ПРИМЕЧАНИЕ. Формы со вставками, которые имеют повторяющиеся атрибуты name
, являются допустимыми HTML и на самом деле являются общим подходом. Использование любого из ответов в этом потоке будет неуместным в этом случае (поскольку объектные ключи должны быть уникальными).
array.prototype.reduce()
недоступен в IE8, поскольку он является частью спецификации ECMAScript 5. Поэтому, если вам нужна поддержка IE8, вы захотите использовать polyfill или другое решение в целом.
– gfullam
12 March 2015 в 15:02
Существует плагин, который делает это для jQuery, jquery.serializeJSON . Я успешно использовал его в нескольких проектах. Отлично работает.
Если вы пытаетесь преобразовать все поля формы в JSON, чтобы отправить эту форму через Ajax, здесь добавлен плагин jQuery form .
Использование:
function form_to_json (selector) {
var ary = $(selector).serializeArray();
var obj = {};
for (var a = 0; a < ary.length; a++) obj[ary[a].name] = ary[a].value;
return obj;
}
Выход:
{"myfield": "myfield value", "passwordfield": "mypasswordvalue"}
Простота здесь лучше. Я использовал замену простой строки с регулярным выражением, и до сих пор они работали как шарм. Я не специалист по регулярному выражению, но я уверен, вы можете даже заполнить очень сложные объекты.
var values = $(this).serialize(),
attributes = {};
values.replace(/([^&]+)=([^&]*)/g, function (match, name, value) {
attributes[name] = value;
});
Я нашел проблему с выбранным решением.
При использовании форм с именами на основе массива функция jQuery serializeArray () фактически умирает.
У меня есть фреймворк PHP, который использует имена полей на основе массива, чтобы одна и та же страница могла быть помещена на одну и ту же страницу несколько раз в нескольких представлениях. Это может быть удобно для добавления и редактирования и удаления на одной странице без противоречивых моделей форм.
Поскольку я хотел серализовать формы без необходимости использовать эту абсолютную базовую функциональность, я решил написать свою собственную seralizeArray ():
var $vals = {};
$("#video_edit_form input").each(function(i){
var name = $(this).attr("name").replace(/editSingleForm\[/i, '');
name = name.replace(/\]/i, '');
switch($(this).attr("type")){
case "text":
$vals[name] = $(this).val();
break;
case "checkbox":
if($(this).attr("checked")){
$vals[name] = $(this).val();
}
break;
case "radio":
if($(this).attr("checked")){
$vals[name] = $(this).val();
}
break;
default:
break;
}
});
Обратите внимание: это также работает вне формы submit (), поэтому, если в остальной части вашего кода появляется ошибка, форма не будет отправлена, если вы поместите ссылку на кнопку говоря «сохранить изменения».
Также обратите внимание, что эту функцию никогда не следует использовать для проверки формы только для сбора данных для отправки на сервер для проверки. Использование такого слабого и массового кода приведет к XSS и т. Д.
Другой ответ
document.addEventListener("DOMContentLoaded", function() {
setInterval(function() {
var form = document.getElementById('form') || document.querySelector('form[name="userprofile"]');
var json = Array.from(new FormData(form)).map(function(e,i) {this[e[0]]=e[1]; return this;}.bind({}))[0];
console.log(json)
document.querySelector('#asJSON').value = JSON.stringify(json);
}, 1000);
})
<form name="userprofile" id="form">
<p>Name <input type="text" name="firstname" value="John"/></p>
<p>Family name <input name="lastname" value="Smith"/></p>
<p>Work <input name="employment[name]" value="inc, Inc."/></p>
<p>Works since <input name="employment[since]" value="2017" /></p>
<p>Photo <input type="file" /></p>
<p>Send <input type="submit" /></p>
</form>
JSON: <textarea id="asJSON"></textarea>
FormData: https://developer.mozilla.org/en-US / документы / Web / API / FormData
У меня была такая же проблема в последнее время и вышла с этим плагином jQuery jQuery , который преобразует форму в объект JSON с той же структурой. Это также чрезвычайно полезно для динамически создаваемых форм, где вы хотите, чтобы ваш пользователь добавлял больше полей в определенные места.
Суть в том, что вы действительно можете создать форму, чтобы она имела структуру, поэтому допустим, вы хотите создать форму, в которой пользователь вставляет свои любимые места в городе: вы можете представить эту форму для представления XML-элемента <places>...</places>
, содержащего список мест, которым нравится пользователь, таким образом, список элементов <place>...</place>
, каждый из которых содержит например, элемент <name>...</name>
, элемент <type>...</type>
, а затем список элементов <activity>...</activity>
для представления действий, которые вы можете выполнять в таком месте. Таким образом, ваша структура XML будет выглядеть так:
<places>
<place>
<name>Home</name>
<type>dwelling</type>
<activity>sleep</activity>
<activity>eat</activity>
<activity>watch TV</activity>
</place>
<place>...</place>
<place>...</place>
</places>
Как здорово было бы иметь объект JSON из этого, который будет представлять эту точную структуру, чтобы вы могли: либо
ОК, так что теперь нам нужно подумать о том, как форма может представлять XML-файл.
Конечно, тег <form>
- это root
, но тогда у нас есть этот элемент <place>
, который является контейнером, а не самим элементом данных, поэтому мы не можем использовать тег ввода для него.
Вот где тег <fieldset>
пригодится! Мы будем использовать теги <fieldset>
для представления всех элементов контейнера в нашем представлении формы / XML и поэтому получаем такой результат:
<form name="places">
<fieldset name="place">
<input type="text" name="name"/>
<select name="type">
<option value="dwelling">Dwelling</option>
<option value="restoration">Restoration</option>
<option value="sport">Sport</option>
<option value="administrative">Administrative</option>
</select>
<input type="text" name="activity"/>
<input type="text" name="activity"/>
<input type="text" name="activity"/>
</fieldset>
</form>
Как вы можете видеть в этой форме, мы нарушаем правило уникальных имен, но это нормально, потому что они будут преобразованы в массив элементов, поэтому на них будет ссылаться только их индекс внутри массива.
На этом этапе вы можете увидеть, как есть no name="array[]"
, как имя внутри формы, и все довольно, просто и семантично.
Теперь мы хотим, чтобы эта форма была преобразована в объект JSON, который будет выглядеть следующим образом:
{'places':{
'place':[
{
'name': 'Home',
'type': 'dwelling',
'activity':[
'sleep',
'eat',
'watch TV'
]
},
{...},
{...}
]
}}
Для этого я разработал этот плагин jQuery здесь , который кто-то помог оптимизировать в этот поток обзора кода и выглядит так:
$.fn.toJSO = function () {
var obj = {},
$kids = $(this).children('[name]');
if (!$kids.length) {
return $(this).val();
}
$kids.each(function () {
var $el = $(this),
name = $el.attr('name');
if ($el.siblings("[name=" + name + "]").length) {
if (!/radio|checkbox/i.test($el.attr('type')) || $el.prop('checked')) {
obj[name] = obj[name] || [];
obj[name].push($el.toJSO());
}
} else {
obj[name] = $el.toJSO();
}
});
return obj;
};
Я также сделал это одно сообщение в блоге , чтобы объяснить это больше.
Это преобразует все в форме в JSON (даже радио и флажки), и все, что вы оставите do is call
$.post('script.php',('form').toJSO(), ...);
Я знаю, что есть много способов конвертировать формы в объектах JSON и в большинстве случаев .serialize()
и .serializeArray()
работают отлично и в основном предназначены для использования, но я думаю, что вся эта идея записывает форму как структуру XML со значимыми именами и преобразует ее в хорошо сформированный объект JSON стоит попробовать, а также тот факт, что вы можете добавлять теги ввода с одним и тем же именем, не беспокоясь, очень полезно, если вам нужно извлечь динамически генерируемые данные форм.
Надеюсь, это помогает кому-то!
Вы можете сделать это:
var frm = $(document.myform);
var data = JSON.stringify(frm.serializeArray());
См. JSON .
Используя решение maček , я изменил его, чтобы работать с тем, как ASP.NET MVC обрабатывает свои вложенные / сложные объекты в одной и той же форме. Все, что вам нужно сделать, это изменить часть проверки на это:
"validate": /^[a-zA-Z][a-zA-Z0-9_]*((?:\[(?:\d*|[a-zA-Z0-9_]+)\])*(?:\.)[a-zA-Z][a-zA-Z0-9_]*)*$/,
Это будет соответствовать, а затем правильно отображать элементы с такими именами, как:
<input type="text" name="zooName" />
И
<input type="text" name="zooAnimals[0].name" />
При всем заданном ответе есть какая-то проблема, которая ...
blockquote>Если имя входа в качестве массива похожее на
name[key]
, но оно будет генерироваться следующим образомname:{ key : value }
Например: Если у меня есть такая форма.
<form> <input name="name" value="value" > <input name="name1[key1]" value="value1" > <input name="name2[key2]" value="value2" > <input name="name3[key3]" value="value3" > </form>
Затем он будет генерировать объект таким образом со всем данным ответом.
Object { name : 'value', name1[key1] : 'value1', name2[key2] : 'value2', name3[key3] : 'value3', }
Но он должен генерировать, как показано ниже, каждый хочет получить как это, как показано ниже.
Object { name : 'value', name1 : { key1 : 'value1' }, name2 : { key2 : 'value2' }, name3 : { key2 : 'value2' } }
Затем попробуйте выполнить это ниже кода js.
blockquote>
(function($){ $.fn.getForm2obj = function(){ var _ = {},_t=this; this.c = function(k,v){ eval("c = typeof "+k+";"); if(c == 'undefined') _t.b(k,v);} this.b = function(k,v,a = 0){ if(a) eval(k+".push("+v+");"); else eval(k+"="+v+";"); }; $.map(this.serializeArray(),function(n){ if(n.name.indexOf('[') > -1 ){ var keys = n.name.match(/[a-zA-Z0-9_]+|(?=\[\])/g),le = Object.keys(keys).length,tmp = '_'; $.map(keys,function(key,i){ if(key == ''){ eval("ale = Object.keys("+tmp+").length;"); if(!ale) _t.b(tmp,'[]'); if(le == (i+1)) _t.b(tmp,"'"+n['value']+"'",1); else _t.b(tmp += "["+ale+"]",'{}'); }else{ _t.c(tmp += "['"+key+"']",'{}'); if(le == (i+1)) _t.b(tmp,"'"+n['value']+"'"); } }); }else _t.b("_['"+n['name']+"']","'"+n['value']+"'"); }); return _; } })(jQuery); console.log($('form').getForm2obj());
<!DOCTYPE html><html><head> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> <title>Convert form data to JavaScript object with jQuery</title> </head> <body> <form> <input name="name" value="value" > <input name="name1[key1]" value="value1" > <input name="name2[key2]" value="value2" > <input name="name3[key3]" value="value3" > <input type="checkbox" name="name4[]" value="1" checked="checked"> <input type="checkbox" name="name4[]" value="2"> <input type="checkbox" name="name4[]" value="3"> </form> </body></html>
Источник тока находится на GitHub и bower.
$ bower install jquery- serialize-object
Следующий код теперь устарел.
Следующий код может работать со всеми типами имен ввода; и обрабатывать их так, как вы ожидали.
Например:
<!-- all of these will work! --> <input name="honey[badger]" value="a"> <input name="wombat[]" value="b"> <input name="hello[panda][]" value="c"> <input name="animals[0][name]" value="d"> <input name="animals[0][breed]" value="e"> <input name="crazy[1][][wonky]" value="f"> <input name="dream[as][vividly][as][you][can]" value="g">
// output { "honey":{ "badger":"a" }, "wombat":["b"], "hello":{ "panda":["c"] }, "animals":[ { "name":"d", "breed":"e" } ], "crazy":[ null, [ {"wonky":"f"} ] ], "dream":{ "as":{ "vividly":{ "as":{ "you":{ "can":"g" } } } } } }
Использование
$('#my-form').serializeObject();
Колдовство (JavaScript)
(function($){ $.fn.serializeObject = function(){ var self = this, json = {}, push_counters = {}, patterns = { "validate": /^[a-zA-Z][a-zA-Z0-9_]*(?:\[(?:\d*|[a-zA-Z0-9_]+)\])*$/, "key": /[a-zA-Z0-9_]+|(?=\[\])/g, "push": /^$/, "fixed": /^\d+$/, "named": /^[a-zA-Z0-9_]+$/ }; this.build = function(base, key, value){ base[key] = value; return base; }; this.push_counter = function(key){ if(push_counters[key] === undefined){ push_counters[key] = 0; } return push_counters[key]++; }; $.each($(this).serializeArray(), function(){ // skip invalid keys if(!patterns.validate.test(this.name)){ return; } var k, keys = this.name.match(patterns.key), merge = this.value, reverse_key = this.name; while((k = keys.pop()) !== undefined){ // adjust reverse_key reverse_key = reverse_key.replace(new RegExp("\\[" + k + "\\]$"), ''); // push if(k.match(patterns.push)){ merge = self.build([], self.push_counter(reverse_key), merge); } // fixed else if(k.match(patterns.fixed)){ merge = self.build([], k, merge); } // named else if(k.match(patterns.named)){ merge = self.build({}, k, merge); } } json = $.extend(true, json, merge); }); return json; }; })(jQuery);
<select name="foo" multiple="multiple">
не будет работать ни в одном сценарии. Однако, если вы используете []
, как в <select name="bar[]" multiple="multiple">
, он будет работать просто отлично :)
– maček
31 January 2013 в 20:14
Фиксированная версия решения Тобиаса Коэна. Это правильно обрабатывает значения фальши, такие как 0
и ''
.
jQuery.fn.serializeObject = function() {
var arrayData, objectData;
arrayData = this.serializeArray();
objectData = {};
$.each(arrayData, function() {
var value;
if (this.value != null) {
value = this.value;
} else {
value = '';
}
if (objectData[this.name] != null) {
if (!objectData[this.name].push) {
objectData[this.name] = [objectData[this.name]];
}
objectData[this.name].push(value);
} else {
objectData[this.name] = value;
}
});
return objectData;
};
И версия CoffeeScript для удобства кодирования:
jQuery.fn.serializeObject = ->
arrayData = @serializeArray()
objectData = {}
$.each arrayData, ->
if @value?
value = @value
else
value = ''
if objectData[@name]?
unless objectData[@name].push
objectData[@name] = [objectData[@name]]
objectData[@name].push value
else
objectData[@name] = value
return objectData
value = @value ? ''
– nzifnab
11 September 2012 в 00:23
keyMap
и следующую строку: key = if keyMap? then keyMap(@name) else @name
. Теперь вы можете передать функцию отображения, например (name) -> name.match(/\[([^\]]+)]/)[1]
. И тогда нужно будет изменить все последующие @name
на key
, конечно
– Damir Zekić
19 October 2012 в 14:23
post
, вы могли бы просто сделать $('form').serializeObject().post
. Нет необходимости в фантастическом сопоставлении.
– maček
20 December 2012 в 21:21
objectData[this.name]
метод push (грубо говоря, это массив). Если это массив, он подталкивает значение, если он не является массивом, он преобразует его в массив, так что несколько значений с одним и тем же ключом будут объединены с массивом.
– Daniel X Moore
20 June 2017 в 22:09
Поверните что-нибудь в объект (не тестировалось модулем)
<script type="text/javascript">
string = {};
string.repeat = function(string, count)
{
return new Array(count+1).join(string);
}
string.count = function(string)
{
var count = 0;
for (var i=1; i<arguments.length; i++)
{
var results = string.match(new RegExp(arguments[i], 'g'));
count += results ? results.length : 0;
}
return count;
}
array = {};
array.merge = function(arr1, arr2)
{
for (var i in arr2)
{
if (arr1[i] && typeof arr1[i] == 'object' && typeof arr2[i] == 'object')
arr1[i] = array.merge(arr1[i], arr2[i]);
else
arr1[i] = arr2[i]
}
return arr1;
}
array.print = function(obj)
{
var arr = [];
$.each(obj, function(key, val) {
var next = key + ": ";
next += $.isPlainObject(val) ? array.print(val) : val;
arr.push( next );
});
return "{ " + arr.join(", ") + " }";
}
node = {};
node.objectify = function(node, params)
{
if (!params)
params = {};
if (!params.selector)
params.selector = "*";
if (!params.key)
params.key = "name";
if (!params.value)
params.value = "value";
var o = {};
var indexes = {};
$(node).find(params.selector+"["+params.key+"]").each(function()
{
var name = $(this).attr(params.key),
value = $(this).attr(params.value);
var obj = $.parseJSON("{"+name.replace(/([^\[]*)/, function()
{
return '"'+arguments[1]+'"';
}).replace(/\[(.*?)\]/gi, function()
{
if (arguments[1].length == 0)
{
var index = arguments[3].substring(0, arguments[2]);
indexes[index] = indexes[index] !== undefined ? indexes[index]+1 : 0;
return ':{"'+indexes[index]+'"';
}
else
return ':{"'+escape(arguments[1])+'"';
})+':"'+value.replace(/[\\"]/gi, function()
{
return "\\"+arguments[0];
})+'"'+string.repeat('}', string.count(name, ']'))+"}");
o = array.merge(o, obj);
});
return o;
}
</script>
Выход теста:
$(document).ready(function()
{
console.log(array.print(node.objectify($("form"), {})));
console.log(array.print(node.objectify($("form"), {selector: "select"})));
});
на
<form>
<input name='input[a]' type='text' value='text'/>
<select name='input[b]'>
<option>select</option>
</select>
<input name='otherinput[c][a]' value='a'/>
<input name='otherinput[c][]' value='b'/>
<input name='otherinput[d][b]' value='c'/>
<input name='otherinput[c][]' value='d'/>
<input type='hidden' name='anotherinput' value='hidden'/>
<input type='hidden' name='anotherinput' value='1'/>
<input type='submit' value='submit'/>
</form>
будет выход:
{ input: { a: text, b: select }, otherinput: { c: { a: a, 0: b, 1: d }, d: { b: c } }, anotherinput: 1 }
{ input: { b: select } }
Я бы не использовал это на реальном сайте из-за атак XSS и, вероятно, много других проблем, но вот краткий пример того, что вы могли бы сделать:
$("#myform").submit(function(){
var arr = $(this).serializeArray();
var json = "";
jQuery.each(arr, function(){
jQuery.each(this, function(i, val){
if (i=="name") {
json += '"' + val + '":';
} else if (i=="value") {
json += '"' + val.replace(/"/g, '\\"') + '",';
}
});
});
json = "{" + json.substring(0, json.length - 1) + "}";
// do something with json
return false;
});
Все эти ответы казались мне более верными. Есть что сказать, для простоты. Пока все ваши входы формы имеют атрибут атрибута имени, это должно работать только джим-денди.
blockquote>$('form.myform').submit(function () { var $this = $(this) , viewArr = $this.serializeArray() , view = {}; for (var i in viewArr) { view[viewArr[i].name] = viewArr[i].value; } //Do stuff with view object here (e.g. JSON.stringify?) });
Для быстрого, современного решения используйте плагин jQuery JSONify jQuery. Пример ниже приведен дословно из GitHub README.
<form id="myform">
<label>Name:</label>
<input type="text" name="name"/>
<label>Email</label>
<input type="text" name="email"/>
<label>Password</label>
<input type="password" name="password"/>
</form>
Запуск:
$('#myform').jsonify();
Производит:
{"name":"Joe User","email":"joe@example.com","password":"mypass"}
{"name":"Joe User","email":"joe@example.com","password":"mypass"}
Выполняет:
]
Если вы хотите сделать POST JQuery с этим объектом JSON:
$('#mybutton').click(function() {
$.post('/api/user', JSON.stringify($('#myform').jsonify()));
}
Я предпочитаю этот подход, потому что: вам не нужно перебирать более двух коллекций, вы можете получить доступ к вещам, отличным от «имя» и «значение», если вам нужно, и вы можете дезинфицировать свои ценности, прежде чем хранить их в объект (если у вас есть значения по умолчанию, которые вы не хотите хранить, например).
$.formObject = function($o) {
var o = {},
real_value = function($field) {
var val = $field.val() || "";
// additional cleaning here, if needed
return val;
};
if (typeof o != "object") {
$o = $(o);
}
$(":input[name]", $o).each(function(i, field) {
var $field = $(field),
name = $field.attr("name"),
value = real_value($field);
if (o[name]) {
if (!$.isArray(o[name])) {
o[name] = [o[name]];
}
o[name].push(value);
}
else {
o[name] = value;
}
});
return o;
}
Использовать так:
var obj = $.formObject($("#someForm"));
Проверено только в Firefox.
Что случилось с:
var data = {};
$(".form-selector").serializeArray().map(function(x){data[x.name] = x.value;});
.each
вместо .map
?
– azerafati
6 November 2014 в 11:14
var form = {}; $.each($(this).serializeArray(), function (i, field) { form[field.name] = field.value || ""; });
– tfmontague
31 May 2015 в 07:02
$(this).serializeArray().reduce(function(m,o){ m[o.name] = o.value; return m;}, {})
– juanpastas
13 June 2015 в 21:19
самым простым и точным способом, который я нашел для этой проблемы, было использование bbq plugin или этого one (размер которого составляет около 0,5 КБ).
он также работает с многомерными массивами.
$.fn.serializeObject = function()
{
return $.deparam(this.serialize());
};
Эта функция должна обрабатывать многомерные массивы вместе с несколькими элементами с тем же именем.
Я использовал его уже пару лет:
jQuery.fn.serializeJSON=function() {
var json = {};
jQuery.map(jQuery(this).serializeArray(), function(n, i) {
var _ = n.name.indexOf('[');
if (_ > -1) {
var o = json;
_name = n.name.replace(/\]/gi, '').split('[');
for (var i=0, len=_name.length; i<len; i++) {
if (i == len-1) {
if (o[_name[i]]) {
if (typeof o[_name[i]] == 'string') {
o[_name[i]] = [o[_name[i]]];
}
o[_name[i]].push(n.value);
}
else o[_name[i]] = n.value || '';
}
else o = o[_name[i]] = o[_name[i]] || {};
}
}
else {
if (json[n.name] !== undefined) {
if (!json[n.name].push) {
json[n.name] = [json[n.name]];
}
json[n.name].push(n.value || '');
}
else json[n.name] = n.value || '';
}
});
return json;
};
Однострочный (без зависимостей, кроме jQuery), использует привязку фиксированного объекта для функции, переданной в метод map
.
$('form').serializeArray().map(function(x){this[x.name] = x.value; return this;}.bind({}))[0]
Что он делает?
"id=2&value=1&comment=ok" => Object { id: "2", value: "1", comment: "ok" }
подходит для прогрессивных веб-приложений (можно легко поддерживать как регулярное представление формы, так и запросы ajax)
Невозможно сделать это без изучения каждого из элементов. То, что вы действительно хотите знать, «кто-то еще уже написал метод, который преобразует форму в объект JSON?» Что-то вроде следующего должно работать - обратите внимание, что он даст вам только элементы формы, которые будут возвращены через POST (должно иметь имя). Это не проверено.
function formToJSON( selector )
{
var form = {};
$(selector).find(':input[name]:enabled').each( function() {
var self = $(this);
var name = self.attr('name');
if (form[name]) {
form[name] = form[name] + ',' + self.val();
}
else {
form[name] = self.val();
}
});
return form;
}
Я нашел проблему с кодом Тобиаса Коэна (у меня недостаточно очков, чтобы прокомментировать это напрямую), что в противном случае работает для меня. Если у вас есть два варианта выбора с тем же именем, оба со значением = "", исходный код будет генерировать «имя»: «» вместо «name»: ["", ""]
I подумайте, что это можно исправить добавлением «|| o [this.name] == ''" к первому условию if:
$.fn.serializeObject = function()
{
var o = {};
var a = this.serializeArray();
$.each(a, function() {
if (o[this.name] || o[this.name] == '') {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
return o;
};
Из некоторого ответа старше :
$('form input,select').toArray().reduce(function(m,e){m[e.name] = $(e).val(); return m;},{})
map
, как это создает массив объектов с одним свойством, он не сворачивает все свойства в один объект.
– joshperry
1 October 2010 в 23:46
serializeArray
, поэтому у вас есть свобода выбора любых входных данных, которые вы хотите (например, вы можете включать отключенные входы), правильно? То есть это не связано с какой-либо формой или событием отправки, это просто независимо само по себе?
– dtgq
27 May 2016 в 01:12
reduce
возвращает объект. Это не является независимым, так как toArray
из jQuery.
– juanpastas
27 May 2016 в 15:09
$.map( $("#container :input"), function(n, i) { /* n.name and $(n).val() */ } );
, если вам нужно включить отключенные элементы. – Samuel Meacham 19 July 2010 в 00:54foo[bar]
как ожидалось, не говоря уже о большинстве других разновидностей входных имен. После того, как я был очень расстроен неглубокими решениями этой проблемы, я в конечном итоге написал свой собственный плагин jQuery - подробности в ответе, который я дал этому вопросу. – maček 7 December 2011 в 22:13