1769 Stimmen

Konvertieren von Formulardaten in ein JavaScript-Objekt mit jQuery

Wie kann ich alle Elemente meines Formulars in ein JavaScript-Objekt umwandeln?

Ich möchte eine Möglichkeit haben, automatisch ein JavaScript-Objekt aus meinem Formular zu erstellen, ohne jedes Element in einer Schleife durchlaufen zu müssen. Ich möchte keine Zeichenkette, wie sie von $('#formid').serialize(); noch will ich die Karte, die von $('#formid').serializeArray();

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

7voto

sites Punkte 20647

Von einigen ältere Antwort:

$('form input, form select').toArray().reduce(function(m,e){m[e.name] = $(e).val(); return m;},{})

0 Stimmen

Soweit ich das beurteilen kann, besteht der Unterschied darin, dass Ihre Lösung nicht von serializeArray Sie haben also die Freiheit, beliebige Eingaben zu wählen (z. B. können Sie deaktivierte Eingaben einschließen), richtig? D.h. dies ist nicht an ein Formular oder das Submit-Ereignis gekoppelt, sondern unabhängig?

0 Stimmen

Der einzige kleine Unterschied zur verknüpften Antwort besteht darin, dass für die Instanziierung keine Daten erforderlich sind, reduce gibt das Objekt zurück. Dies ist nicht unabhängig, da toArray ist von jQuery.

6voto

Stonetip Punkte 1132
const formData = new FormData(form);

let formDataJSON = {};

for (const [key, value] of formData.entries()) {

    formDataJSON[key] = value;
}

6voto

ngr Punkte 139

Einfachheit ist hier das Beste. Ich habe eine einfache Zeichenfolge mit einem regulären Ausdruck ersetzen, und sie funktionierte wie ein Charme so weit. Ich bin kein Experte für reguläre Ausdrücke, aber ich wette, Sie können auch sehr komplexe Objekte auffüllen.

var values = $(this).serialize(),
attributes = {};

values.replace(/([^&]+)=([^&]*)/g, function (match, name, value) {
    attributes[name] = value;
});

6voto

user1134789 Punkte 51

Ich habe ein Problem mit dem Code von Tobias Cohen gefunden (ich habe nicht genug Punkte, um ihn direkt zu kommentieren), der ansonsten bei mir funktioniert. Wenn Sie zwei Select-Optionen mit demselben Namen haben, beide mit value="", erzeugt der ursprüngliche Code "name":"" anstelle von "name":["",""]

Ich denke, dies kann durch Hinzufügen von " || o[this.name] == ''" zur ersten if-Bedingung behoben werden:

$.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;
};

5voto

G-Ram Punkte 33

Verwendung von macek's Lösung Ich änderte es mit der Art und Weise ASP.NET MVC behandelt ihre verschachtelten/komplexe Objekte auf dem gleichen Formular zu arbeiten. Alles, was Sie tun müssen, ist die Validierung Stück zu diesem ändern:

"validate": /^[a-zA-Z][a-zA-Z0-9_]*((?:\[(?:\d*|[a-zA-Z0-9_]+)\])*(?:\.)[a-zA-Z][a-zA-Z0-9_]*)*$/,

Dadurch werden Elemente mit Namen wie:

<input type="text" name="zooName" />

Und

<input type="text" name="zooAnimals[0].name" />

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X