Saya memiliki objek JS datar:
{a: 1, b: 2, c: 3, ..., z:26}
Saya ingin mengkloning objek kecuali satu elemen:
{a: 1, c: 3, ..., z:26}
Apa cara termudah untuk melakukan ini (lebih suka menggunakan es6 / 7 jika mungkin)?
Saya memiliki objek JS datar:
{a: 1, b: 2, c: 3, ..., z:26}
Saya ingin mengkloning objek kecuali satu elemen:
{a: 1, c: 3, ..., z:26}
Apa cara termudah untuk melakukan ini (lebih suka menggunakan es6 / 7 jika mungkin)?
Jawaban:
Jika Anda menggunakan Babel, Anda dapat menggunakan sintaks berikut untuk menyalin properti b dari x ke dalam variabel b dan kemudian menyalin sisa properti ke dalam variabel y :
dan itu akan diubah menjadi:
sumber
let x = [{a: 1, b: 2, c: 3, z:26}, {a: 5, b: 6, c: 7, z:455}];
ignoreRestSiblings
yang ditambahkan di v3.15.0 (3 Februari 2017). Lihat: commit c59a0bab
ruang lingkup.atau jika Anda menerima properti tidak terdefinisi:
sumber
Untuk menambah jawaban Ilya Palkin: Anda bahkan dapat menghapus kunci secara dinamis:
Demo dalam Babel REPL
Sumber:
sumber
_
yang diizinkan untuk variabel yang tidak ingin Anda gunakan?var b = {a:44, b:7, c:1}; let {['a']:z, ...others} = b; console.log(z , others ); // logs: 44, {b:7, c:1}
Bagi yang tidak bisa menggunakan ES6, Anda bisa menggunakan
lodash
atauunderscore
.Atau
ramda
.sumber
_.omit(x, 'b')
delete
.Saya menggunakan ESNext one liner ini
Jika Anda membutuhkan fungsi tujuan umum:
sumber
map
Anda dapat melakukan:(({b, c, ...others}) => ({...others}))(obj)
Anda dapat menulis fungsi pembantu sederhana untuk itu. Lodash memiliki fungsi serupa dengan nama yang sama: menghilangkan
Juga, perhatikan bahwa ini lebih cepat dari Object.assign dan hapus kemudian: http://jsperf.com/omit-key
sumber
Mungkin kira-kira seperti ini:
Apakah ini cukup baik? Atau tidak dapat
c
benar - benar disalin?sumber
Menggunakan Destrukturisasi Objek
sumber
_
tidak menyelesaikan masalah untuk ESLint ...Hei sepertinya Anda mengalami masalah referensi ketika Anda mencoba menyalin objek kemudian menghapus properti. Di suatu tempat Anda harus menetapkan variabel primitif sehingga javascript membuat nilai baru.
Trik sederhana (mungkin menghebohkan) yang saya gunakan adalah ini
sumber
JSON.parse(JSON.stringify(Object.assign({}, obj, { key2: undefined })));
. Bahkan tidak perlu menghapusnya, hanya perlu nilai palsu.Berikut adalah opsi untuk menghilangkan kunci dinamis yang saya yakin belum disebutkan:
removeMe
aliasremovedKey
dan diabaikan.newObj
menjadi{ 2: 2, 3: 3, 4: 4 }
. Perhatikan bahwa kunci yang dihapus tidak ada, nilainya tidak hanya diatur keundefined
.sumber
sumber
Lodash omit
sumber
Anda juga dapat menggunakan operator spread untuk melakukan ini
sumber
copy
const copy = { ...source, b: undefined }
bermuara persis sama.Solusi di atas menggunakan penataan menderita dari fakta bahwa Anda memiliki variabel yang digunakan, yang dapat menyebabkan keluhan dari ESLint jika Anda menggunakannya.
Jadi, inilah solusi saya:
Pada sebagian besar platform (kecuali IE kecuali menggunakan Babel), Anda juga dapat melakukan:
sumber
Bagaimana dengan ini:
sumber
Jika Anda berurusan dengan variabel besar, Anda tidak ingin menyalinnya dan kemudian menghapusnya, karena ini tidak efisien.
Sederhana untuk-loop dengan cek hasOwnProperty harus bekerja, dan itu jauh lebih mudah beradaptasi dengan kebutuhan di masa depan:
sumber
Bagaimana dengan ini? Saya tidak pernah menemukan derai ini di sekitar tetapi saya hanya mencoba untuk mengecualikan satu atau lebih properti tanpa perlu membuat objek tambahan. Ini sepertinya berhasil, tetapi ada beberapa efek samping yang tidak dapat saya lihat. Yang pasti tidak terlalu mudah dibaca.
sumber
Saya melakukannya dengan cara ini, sebagai contoh dari redux Redux saya:
Dengan kata lain:
sumber
const { [removeMe]: removedKey, ...newObj } = obj;
- lihat jawaban saya pada pertanyaan ini.Baru-baru ini saya melakukannya dengan cara yang sangat sederhana:
hanya menggunakan operator spread untuk memisahkan properti yang tidak diinginkan:
... dan objek.tugaskan untuk mengambil hanya bagian 'sisanya':
sumber
rest
sudah menjadi objek baru - Anda tidak perlu baris terakhir. Plus, ini identik dengan solusi yang diterima.sumber