Ich habe überprüft, dass es ein Problem mit allen anderen Antworten gibt, dass, wenn der Eingabename als Array ist, wie name[key]
dann sollte sie wie folgt generiert werden:
name:{ key : value }
Zum Beispiel: Wenn Sie ein HTML-Formular ähnlich dem untenstehenden haben:
<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>
Aber es sollte genau wie das JSON unten generiert werden, und wird nicht ein Objekt wie das folgende mit allen anderen Antworten. Wenn also jemand so etwas wie das folgende JSON erzeugen möchte, versuchen Sie den folgenden JS-Code.
{
name : 'value',
name1 : { key1 : 'value1' },
name2 : { key2 : 'value2' },
name3 : { key2 : 'value2' }
}
$.fn.getForm2obj = function() {
var _ = {};
$.map(this.serializeArray(), function(n) {
const keys = n.name.match(/[a-zA-Z0-9_]+|(?=\[\])/g);
if (keys.length > 1) {
let tmp = _;
pop = keys.pop();
for (let i = 0; i < keys.length, j = keys[i]; i++) {
tmp[j] = (!tmp[j] ? (pop == '') ? [] : {} : tmp[j]), tmp = tmp[j];
}
if (pop == '') tmp = (!Array.isArray(tmp) ? [] : tmp), tmp.push(n.value);
else tmp[pop] = n.value;
} else _[keys.pop()] = n.value;
});
return _;
}
console.log($('form').getForm2obj());
$('form input').change(function() {
console.clear();
console.log($('form').getForm2obj());
});
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<form>
<input name="name" value="value">
<input type="checkbox" name="name1[]" value="1" checked="checked">1
<input type="checkbox" name="name1[]" value="2">2
<input type="checkbox" name="name1[]" value="3">3<br>
<input type="radio" name="gender" value="male" checked="checked">male
<input type="radio" name="gender" value="female"> female
<input name="name2[key1]" value="value1">
<input name="one[another][another_one]" value="value4">
<input name="name3[1][name]" value="value4">
<input name="name3[2][name]" value="value4">
<input name="[]" value="value5">
</form>
19 Stimmen
Denn die erste gibt eine Zeichenkette zurück, genau wie das, was Sie bekommen würden, wenn Sie das Formular mit einer GET-Methode übermitteln würden, und die zweite gibt Ihnen ein Array von Objekten, jedes mit einem Name-Wert-Paar. Ich möchte, dass ich, wenn ich ein Feld mit dem Namen "email" habe, ein Objekt erhalte, das es mir ermöglicht, diesen Wert mit obj.email abzurufen. Mit serializeArray() müsste ich etwas tun wie obj[indexOfElement].value