Apakah ada cara pintar (yaitu dioptimalkan) untuk mengubah nama kunci dalam objek javascript?
Cara yang tidak dioptimalkan adalah:
o[ new_key ] = o[ old_key ];
delete o[ old_key ];
javascript
object
key
rename
Jean Vincent
sumber
sumber
Jawaban:
Saya yakin cara paling lengkap untuk melakukan ini adalah:
Metode ini memastikan bahwa properti yang diubah namanya berperilaku identik dengan yang asli.
Juga, bagi saya tampaknya kemungkinan untuk membungkus ini menjadi fungsi / metode dan memasukkannya ke dalam
Object.prototype
tidak relevan dengan pertanyaan Anda.sumber
if (old_key !== new_key)
untuk:if (old_key !== new_key && o[old_key])
Anda bisa membungkus pekerjaan dalam suatu fungsi dan menugaskannya ke
Object
prototipe. Mungkin menggunakan gaya antarmuka yang lancar untuk membuat banyak aliran nama.ECMAScript 5 Spesifik
Saya berharap sintaksnya tidak serumit ini, tetapi sudah pasti bagus memiliki lebih banyak kontrol.
sumber
Object.defineProperty
.hasOwnProperty
untuk memeriksa properti dan dalamfor ... in
loop, lalu mengapa itu penting jika kita memperluas Object?Jika Anda bermutasi objek sumber Anda, ES6 dapat melakukannya dalam satu baris.
Atau dua baris jika Anda ingin membuat objek baru.
sumber
[]
di sekitarnewKey
? Solusinya bekerja tanpa itu sebenarnya.Jika seseorang perlu mengganti nama daftar properti:
Pemakaian:
sumber
my_object_property
kemyObjectProperty
, namun, jika properti saya adalah satu-worded, maka kuncinya telah dihapus. +1Saya hanya ingin menggunakan
ES6(ES2015)
caranya!sumber
Jika Anda tidak ingin mengubah data Anda, pertimbangkan fungsi ini ...
Penjelasan menyeluruh oleh Yazeed Bzadough https://medium.com/front-end-hacking/immutably-rename-object-keys-in-javascript-5f6353c7b6dd
sumber
Sebagian besar jawaban di sini gagal mempertahankan urutan pasangan kunci-nilai Objek JS. Jika Anda memiliki bentuk pasangan nilai kunci objek pada layar yang ingin Anda modifikasi, misalnya, penting untuk mempertahankan urutan entri objek.
Cara ES6 untuk mengulang melalui objek JS dan mengganti pasangan nilai kunci dengan pasangan baru dengan nama kunci yang dimodifikasi akan menjadi sesuatu seperti:
Solusi mempertahankan urutan entri dengan menambahkan entri baru di tempat yang lama.
sumber
Anda dapat mencoba Lodash
_.mapKeys
.sumber
Variasi menggunakan operator perusakan dan penyebaran objek:
sumber
Secara pribadi, cara paling efektif untuk mengubah nama kunci pada objek tanpa menerapkan plugins dan roda ekstra berat:
Anda juga dapat membungkusnya
try-catch
jika objek Anda memiliki struktur yang tidak valid. Bekerja dengan sempurna :)sumber
'a'
di{ a: 1, aa: 2, aaa: 3}
atau mencoba untuk mengubah nama objek dengan nilai-nilai yang sesuatu yang lebih dari string atau angka atau boolean, atau mencoba dengan referensi melingkar.Untuk menambahkan awalan ke setiap tombol:
sumber
Saya akan melakukan sesuatu seperti ini:
sumber
Saya akan mengatakan bahwa akan lebih baik dari sudut pandang konseptual untuk meninggalkan objek lama (yang dari layanan web) apa adanya, dan menempatkan nilai-nilai yang Anda butuhkan dalam objek baru. Saya berasumsi Anda mengekstraksi bidang tertentu pada satu titik atau yang lain, jika tidak pada klien, maka setidaknya di server. Fakta bahwa Anda memilih untuk menggunakan nama bidang yang sama dengan yang dari layanan web, hanya huruf kecil, tidak benar-benar mengubah ini. Jadi, saya menyarankan untuk melakukan sesuatu seperti ini:
Tentu saja, saya membuat segala macam asumsi di sini, yang mungkin tidak benar. Jika ini tidak berlaku untuk Anda, atau jika terlalu lambat (bukan? Saya belum menguji, tapi saya membayangkan perbedaannya semakin kecil dengan meningkatnya jumlah bidang), abaikan semua ini :)
Jika Anda tidak ingin melakukan ini, dan Anda hanya perlu mendukung browser tertentu, Anda juga dapat menggunakan getter baru untuk juga mengembalikan "huruf besar (bidang)": lihat http://robertnyman.com/2009/05/28 / getters-and-setters-with-javascript-code-samples-and-demo / dan tautan pada halaman itu untuk informasi lebih lanjut.
EDIT:
Luar biasa, ini juga hampir dua kali lebih cepat, setidaknya pada FF3.5 saya di tempat kerja. Lihat: http://jsperf.com/spiny001
sumber
Meskipun ini tidak memberikan solusi yang lebih baik untuk mengganti nama kunci, ini menyediakan cara ES6 yang cepat dan mudah untuk mengganti nama semua kunci dalam suatu objek tanpa mengubah data yang dikandungnya.
sumber
Beberapa solusi yang tercantum di halaman ini memiliki beberapa efek samping:
Berikut adalah solusi yang menjaga posisi kunci di tempat yang sama dan kompatibel di IE9 +, tetapi harus membuat objek baru dan mungkin bukan solusi tercepat:
Harap dicatat: IE9 mungkin tidak mendukung untukEach dalam mode ketat
sumber
Berikut ini adalah contoh untuk membuat objek baru dengan tombol berganti nama.
sumber
Namun cara lain dengan metode REDUCE paling kuat .
sumber
Ini adalah modifikasi kecil yang saya buat untuk fungsi pomber; Untuk dapat mengambil Array Objek alih-alih objek saja dan Anda juga dapat mengaktifkan indeks. "Tombol" juga dapat ditetapkan oleh array
uji
sumber
Cara Anda dioptimalkan, menurut saya. Tetapi Anda akan berakhir dengan kunci yang dipesan ulang. Kunci yang baru dibuat akan ditambahkan di bagian akhir. Saya tahu Anda tidak boleh bergantung pada urutan kunci, tetapi jika Anda harus melestarikannya, Anda harus memeriksa semua kunci dan membuat objek baru satu per satu, mengganti kunci yang dimaksud selama proses itu.
Seperti ini:
sumber
sumber
coba saja di editor favorit Anda <3
sumber