Bagaimana cara mengonversi semua elemen formulir saya ke objek JavaScript?
Saya ingin memiliki beberapa cara untuk secara otomatis membangun objek JavaScript dari formulir saya, tanpa harus mengulang setiap elemen. Saya tidak ingin string, seperti yang dikembalikan oleh $('#formid').serialize();
, saya juga tidak ingin peta dikembalikan oleh$('#formid').serializeArray();
javascript
jquery
json
serialization
Yisroel
sumber
sumber
Jawaban:
serializeArray
sudah melakukan hal itu. Anda hanya perlu memijat data ke dalam format yang Anda butuhkan:Perhatikan bidang tersembunyi yang memiliki nama yang sama dengan input asli karena akan ditimpa.
sumber
$.map( $("#container :input"), function(n, i) { /* n.name and $(n).val() */ } );
jika Anda perlu memasukkan elemen yang dinonaktifkan.foo[bar]
input -tipe seperti yang diharapkan, belum lagi sebagian besar varietas nama input lainnya. Setelah sangat frustrasi dengan solusi dangkal untuk masalah ini, saya akhirnya menulis plugin jQuery saya sendiri - detail dalam jawaban yang saya berikan untuk pertanyaan ini.Konversikan formulir ke JSON seperti bos
Sumber saat ini ada di GitHub dan Bower .
Kode berikut sekarang sudah tidak digunakan lagi .
Kode berikut dapat bekerja dengan semua jenis nama input; dan menanganinya seperti yang Anda harapkan.
Sebagai contoh:
Pemakaian
The Sorcery (JavaScript)
sumber
<select name="foo" multiple="multiple">
tidak akan berfungsi dalam skenario apa pun. Namun, jika Anda menggunakan[]
, seperti pada<select name="bar[]" multiple="multiple">
, itu akan berfungsi dengan baik :)Ada apa dengan:
sumber
.each
bukan.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;}, {})
Versi tetap dari solusi Tobias Cohen. Yang ini dengan benar menangani nilai-nilai palsu seperti
0
dan''
.Dan versi CoffeeScript untuk kenyamanan pengkodean Anda:
sumber
value = @value ? ''
keyMap
dan baris berikut:key = if keyMap? then keyMap(@name) else @name
. Sekarang Anda dapat melewati fungsi pemetaan seperti(name) -> name.match(/\[([^\]]+)]/)[1]
. Dan kemudian orang akan perlu untuk mengubah semua berikutnya@name
untukkey
, tentu sajapost
Anda, Anda bisa melakukannya$('form').serializeObject().post
. Tidak perlu pemetaan mewah.if (!objectData[this.name].push)
??objectData[this.name]
memiliki metode push (kira-kira, apakah ini array). Jika itu adalah array, ia mendorong nilai, jika bukan array, itu mengubahnya menjadi array sehingga beberapa nilai dengan kunci yang sama akan digabungkan ke array.Saya suka menggunakan
Array.prototype.reduce
karena ini adalah one-liner, dan tidak bergantung pada Underscore.js atau sejenisnya:Ini mirip dengan jawaban yang digunakan
Array.prototype.map
, tetapi Anda tidak perlu mengacaukan ruang lingkup Anda dengan variabel objek tambahan. Belanja satu atap.CATATAN PENTING : Formulir dengan input yang memiliki
name
atribut duplikat adalah HTML yang valid, dan sebenarnya merupakan pendekatan umum. Menggunakan salah satu jawaban di utas ini akan tidak sesuai dalam kasus itu (karena kunci objek harus unik).sumber
array.prototype.reduce()
tidak tersedia di IE8 karena ini adalah bagian dari spesifikasi ECMAScript 5. Jadi jika Anda memerlukan dukungan IE8, Anda ingin menggunakan polyfill atau solusi lain sekaligus.Semua jawaban ini tampak sangat berlebihan bagi saya. Ada sesuatu yang bisa dikatakan untuk kesederhanaan. Selama semua input formulir Anda memiliki atribut nama yang ditetapkan, ini seharusnya hanya berfungsi.
sumber
Tidak ada cara untuk melakukan ini tanpa memeriksa setiap elemen. Apa yang benar-benar ingin Anda ketahui adalah "sudahkah orang lain menulis metode yang mengubah formulir menjadi objek JSON?" Sesuatu seperti yang berikut ini seharusnya berfungsi - perhatikan bahwa itu hanya akan memberi Anda elemen bentuk yang akan dikembalikan melalui POST (harus memiliki nama). Ini tidak diuji .
sumber
Jika Anda menggunakan Underscore.js, Anda dapat menggunakan yang relatif ringkas:
sumber
Saya memeriksa bahwa ada masalah dengan semua jawaban lainnya, bahwa jika nama input adalah array, seperti
name[key]
, maka harus dihasilkan seperti ini:name:{ key : value }
Misalnya: Jika Anda memiliki formulir HTML yang mirip dengan yang di bawah ini:
Tetapi harus dihasilkan seperti JSON di bawah ini, dan tidak menjadi objek seperti berikut dengan semua jawaban lainnya. Jadi, jika ada yang ingin membawa sesuatu seperti JSON berikut, coba kode JS di bawah ini.
sumber
eval
tidak boleh digunakan dengan cara ini karenaeval
, ketika digunakan dengan cara ini, mempromosikan sangat tidak dapat diandalkan, bermasalah, tidak berperforma baik, dan berpotensi berpotensi praktik tidak aman.this.c = function(k,v){ eval("c = typeof "+k+";"); if(c == 'undefined') _t.b(k,v);}
singkat dan tidak jelas. Seorang pengembang dengan pengalaman yang lebih sedikit hanya akan menyalin ini tanpa memahami mengapa dan cara kerjanya.eval()
kode saya.Ok, saya tahu ini sudah memiliki jawaban yang sangat terunggul, tetapi pertanyaan serupa lainnya diajukan baru-baru ini, dan saya juga diarahkan ke pertanyaan ini. Saya juga ingin menawarkan solusi saya, karena ia menawarkan keuntungan dibandingkan solusi yang diterima: Anda dapat menyertakan elemen formulir yang dinonaktifkan (yang kadang-kadang penting, tergantung pada bagaimana fungsi UI Anda)
Ini jawaban saya dari pertanyaan SO lainnya :
Awalnya, kami menggunakan
serializeArray()
metode jQuery , tetapi itu tidak termasuk elemen formulir yang dinonaktifkan. Kami akan sering menonaktifkan elemen formulir yang "disinkronkan" ke sumber lain di halaman, tetapi kami masih perlu memasukkan data ke objek serial kami. BegituserializeArray()
juga keluar. Kami menggunakan:input
pemilih untuk mendapatkan semua elemen input (baik diaktifkan dan dinonaktifkan) dalam wadah yang diberikan, dan kemudian$.map()
untuk membuat objek kami.Perhatikan bahwa agar ini berfungsi, setiap input Anda akan memerlukan
name
atribut, yang akan menjadi nama properti dari objek yang dihasilkan.Itu sebenarnya sedikit dimodifikasi dari apa yang kami gunakan. Kami perlu membuat objek yang terstruktur sebagai .NET IDictionary, jadi kami menggunakan ini: (Saya berikan di sini jika berguna)
Saya suka kedua solusi ini, karena mereka adalah penggunaan
$.map()
fungsi yang sederhana , dan Anda memiliki kontrol penuh atas pemilih Anda (jadi, elemen mana yang Anda akhirnya termasuk dalam objek yang Anda hasilkan). Juga, tidak diperlukan plugin tambahan. JQuery tua polos.sumber
map
seperti ini menciptakan array objek dengan satu properti, tidak meruntuhkan semua properti menjadi satu objek.Fungsi ini harus menangani array multidimensi bersama dengan beberapa elemen dengan nama yang sama.
Saya telah menggunakannya selama beberapa tahun sejauh ini:
sumber
Kamu bisa melakukan ini:
Lihat JSON .
sumber
One-liner (tidak ada dependensi selain jQuery), menggunakan pengikatan objek tetap untuk fungsi yang diteruskan ke
map
metode.Apa itu?
cocok untuk aplikasi web progresif (orang dapat dengan mudah mendukung aksi pengiriman formulir reguler serta permintaan ajax)
sumber
Menggunakan:
Keluaran:
sumber
Kesederhanaan adalah yang terbaik di sini. Saya telah menggunakan pengganti string sederhana dengan ekspresi reguler, dan mereka bekerja seperti pesona sejauh ini. Saya bukan ahli ekspresi reguler, tetapi saya yakin Anda bahkan dapat mengisi objek yang sangat kompleks.
sumber
Dari beberapa jawaban yang lebih tua :
sumber
serializeArray
sehingga Anda memiliki kebebasan untuk memilih input apa pun yang Anda inginkan (mis. Anda dapat memasukkan input yang dinonaktifkan), kan? Yaitu ini tidak digabungkan ke bentuk apa pun atau ajukan acara, itu hanya independen dengan sendirinya?reduce
mengembalikan objek. Ini tidak independen karenatoArray
berasal dari jQuery.Saya menemukan masalah dengan kode Tobias Cohen (saya tidak punya cukup poin untuk mengomentarinya secara langsung), yang jika tidak berfungsi untuk saya. Jika Anda memiliki dua opsi pilih dengan nama yang sama, keduanya dengan nilai = "", kode asli akan menghasilkan "nama": "" bukannya "nama": ["", ""]
Saya pikir ini dapat diperbaiki dengan menambahkan "|| o [this.name] == ''" ke kondisi if pertama:
sumber
Menggunakan solusi maček , saya memodifikasinya agar berfungsi dengan cara ASP.NET MVC menangani objek bersarang / kompleks pada formulir yang sama. Yang harus Anda lakukan adalah memodifikasi bagian validasi untuk ini:
Ini akan cocok dan kemudian memetakan elemen dengan nama seperti:
Dan
sumber
cara paling sederhana dan paling akurat saya ditemukan untuk masalah ini adalah menggunakan bbq Plugin atau ini salah satu (yaitu sekitar 0.5K byte ukuran).
ini juga bekerja dengan array multi dimensi.
sumber
Ada plugin untuk melakukannya untuk jQuery, jquery.serializeJSON . Saya telah menggunakannya dengan sukses pada beberapa proyek sekarang. Itu bekerja seperti pesona.
sumber
sumber
Saya lebih suka pendekatan ini karena: Anda tidak perlu mengulangi lebih dari 2 koleksi, Anda bisa mendapatkan hal-hal selain "nama" dan "nilai" jika Anda perlu, dan Anda dapat membersihkan nilai-nilai Anda sebelum menyimpannya di objek ( jika Anda memiliki nilai default yang tidak ingin Anda simpan, misalnya).
Gunakan seperti ini:
Hanya diuji di Firefox.
sumber
Mengubah apa pun menjadi objek (bukan unit yang diuji)
Output dari tes:
di
akan menghasilkan:
sumber
Saya menemukan masalah dengan solusi yang dipilih.
Saat menggunakan formulir yang memiliki nama berbasis array, fungsi jQuery serializeArray () benar-benar mati.
Saya memiliki kerangka kerja PHP yang menggunakan nama bidang berbasis array untuk memungkinkan formulir yang sama dimasukkan ke halaman yang sama beberapa kali dalam banyak tampilan. Ini bisa berguna untuk menambahkan, mengedit, dan menghapus keduanya pada halaman yang sama tanpa model formulir yang saling bertentangan.
Karena saya ingin mengesahkan formulir tanpa harus mengeluarkan fungsionalitas basis absolut ini, saya memutuskan untuk menulis seralizeArray saya sendiri ():
Harap dicatat: Ini juga berfungsi di luar form submit () jadi jika kesalahan terjadi di sisa kode Anda, form tidak akan mengirimkan jika Anda menempatkan pada tombol tautan yang mengatakan "simpan perubahan".
Perhatikan juga bahwa fungsi ini tidak boleh digunakan untuk memvalidasi formulir hanya untuk mengumpulkan data yang akan dikirim ke sisi server untuk validasi. Menggunakan kode yang lemah dan banyak yang ditugaskan seperti itu AKAN menyebabkan XSS , dll.
sumber
Saya memiliki masalah yang sama belakangan ini dan keluar dengan plugin .toJSON jQuery ini yang mengubah formulir menjadi objek JSON dengan struktur yang sama. Ini juga berguna secara khusus untuk formulir yang dihasilkan secara dinamis di mana Anda ingin membiarkan pengguna Anda menambahkan lebih banyak bidang di tempat-tempat tertentu.
Intinya adalah Anda mungkin benar-benar ingin membangun formulir sehingga memiliki struktur itu sendiri, jadi katakanlah Anda ingin membuat formulir di mana pengguna memasukkan tempat favoritnya di kota: Anda dapat membayangkan formulir ini untuk mewakili
<places>...</places>
elemen XML yang mengandung daftar tempat yang disukai pengguna sehingga daftar<place>...</place>
elemen yang masing-masing berisi misalnya<name>...</name>
elemen,<type>...</type>
elemen dan kemudian daftar<activity>...</activity>
elemen untuk mewakili aktivitas yang dapat Anda lakukan di tempat seperti itu. Jadi struktur XML Anda akan seperti ini:Betapa kerennya memiliki objek JSON dari ini yang akan mewakili struktur yang tepat ini sehingga Anda dapat:
OK, jadi sekarang kita perlu berpikir bagaimana suatu formulir dapat mewakili file XML.
Tentu saja
<form>
tag adalahroot
, tetapi kemudian kita memiliki<place>
elemen yang merupakan wadah dan bukan elemen data itu sendiri, jadi kita tidak dapat menggunakan tag input untuk itu.Di sinilah
<fieldset>
tag berguna! Kami akan menggunakan<fieldset>
tag untuk mewakili semua elemen wadah dalam formulir / representasi XML kami, sehingga mencapai hasil seperti ini:Seperti yang Anda lihat dalam formulir ini, kami melanggar aturan nama unik, tetapi ini OK karena mereka akan dikonversi menjadi array elemen sehingga mereka akan dirujuk hanya dengan indeks mereka di dalam array.
Pada titik ini Anda dapat melihat bagaimana tidak ada
name="array[]"
nama seperti di dalam formulir dan semuanya cantik, sederhana dan semantik.Sekarang kami ingin formulir ini dikonversi menjadi objek JSON yang akan terlihat seperti ini:
Untuk melakukan ini, saya telah mengembangkan plugin jQuery ini di sini di mana seseorang membantu mengoptimalkan dalam utas Tinjauan Kode ini dan terlihat seperti ini:
Saya juga membuat posting blog yang satu ini untuk menjelaskan hal ini lebih lanjut.
Ini mengonversi semuanya dalam bentuk menjadi JSON (bahkan radio dan kotak centang) dan yang harus Anda lakukan hanyalah menelepon
Saya tahu ada banyak cara untuk mengubah bentuk menjadi objek JSON dan tentu saja
.serialize()
dan.serializeArray()
berfungsi dengan baik dalam banyak kasus dan sebagian besar dimaksudkan untuk digunakan, tapi saya pikir seluruh gagasan ini menulis formulir sebagai struktur XML dengan nama yang bermakna dan mengubahnya menjadi objek JSON yang terbentuk dengan baik patut dicoba, juga fakta bahwa Anda dapat menambahkan tag input dengan nama yang sama tanpa khawatir sangat berguna jika Anda perlu retrive data formulir yang dihasilkan secara dinamis.Saya harap ini membantu seseorang!
sumber
Saya mengkodekan bentuk ke objek JavaScript multidimensi sendiri untuk menggunakannya dalam produksi. Hasilnya adalah https://github.com/serbanghita/formToObject.js .
sumber
Jawaban lain
FormData: https://developer.mozilla.org/en-US/docs/Web/API/FormData
sumber
[UPDATE 2020]
Dengan oneliner sederhana di vanilla js:
sumber
Saya suka versi samuels, tetapi saya percaya ini memiliki kesalahan kecil. Biasanya JSON dikirim sebagai
BUKAN sebagai
jadi fungsi IMO harus membaca:
dan untuk membungkusnya dalam array data (seperti yang diharapkan juga), dan akhirnya mengirimkannya sebagai App.stringify astring ({data: App.toJson ('#cropform: input')})
Untuk tampilan ketat pada Pertanyaan 3593046 untuk versi ramping, di json2.js untuk setiap versi yang tercakup pada setiap acara. Itu harus mencakup semuanya :)
sumber
Untuk solusi cepat dan modern, gunakan plugin JSONify jQuery. Contoh di bawah ini diambil kata demi kata dari GitHub README. Semua kredit untuk Kushal Pandya, penulis plugin.
Diberikan:
Berlari:
Menghasilkan:
Jika Anda ingin melakukan jQuery POST dengan objek JSON ini:
sumber