Saya menggunakan Redux. Di peredam saya, saya mencoba menghapus properti dari objek seperti ini:
const state = {
a: '1',
b: '2',
c: {
x: '42',
y: '43'
},
}
Dan saya ingin memiliki sesuatu seperti ini tanpa harus mengubah keadaan aslinya:
const newState = {
a: '1',
b: '2',
c: {
x: '42',
},
}
Saya mencoba:
let newState = Object.assign({}, state);
delete newState.c.y
tetapi untuk beberapa alasan, itu menghapus properti dari kedua negara.
Bisakah saya membantu melakukan itu?
javascript
immutability
redux
Vincent Taing
sumber
sumber
Object.assign
menciptakan hanya copy dangkal daristate
dan oleh karena itustate.c
dannewState.c
akan menunjuk ke objek bersama sama. Anda mencoba menghapus propertiy
dari objek bersamac
dan bukan dari objek barunewState
.Jawaban:
Bagaimana dengan menggunakan sintaksis tugas penugasan ?
sumber
const deleteProperty = ({[key]: _, ...newObj}, key) => newObj;
. Penggunaan:deleteProperty({a:1, b:2}, "a");
memberi{b:2}
deep['c']
kosong, jadi dalam kasus umum, Anda mungkin ingin menambahkan tanda centang untuk keberadaan kunci.Saya menemukan metode array ES5 suka
filter
,map
danreduce
berguna karena mereka selalu mengembalikan array atau objek baru. Dalam hal ini saya akan gunakanObject.keys
untuk beralih pada objek, danArray#reduce
untuk mengubahnya kembali menjadi objek.sumber
myObject
dengan kuncimyKey
dihapus:Object.keys(myObject).reduce((acc, cur) => cur === myKey ? acc : {...acc, [cur]: myObject[cur]}, {})
Anda dapat menggunakan
_.omit(object, [paths])
dari perpustakaan lodashpath dapat disarangkan misalnya:
_.omit(object, ['key1.key2.key3'])
sumber
_.omit
tidak dapat menghapus properti yang dalam (apa yang diminta OP). Adaomit-deep-lodash
modul untuk tujuan ini._.cloneDeep(obj)
dari lodash. Itu menyalin objek dengan mudah dan kemudian Anda cukup menggunakan jsdelete obj.[key]
untuk menghapus kunci.Cukup gunakan fitur penghancuran objek ES6
sumber
const {y, ...c} = state.c
mungkin sedikit lebih jelas daripada memiliki duac
di sisi kiri.const name = 'c'
maka Anda dapat melakukannyaconst {[name]:deletedValue, ...newState} = state
kemudian kembalinewState
dalam peredam Anda. Ini untuk penghapusan kunci tingkat atasItu karena Anda menyalin nilai
state.c
ke objek lain. Dan nilai itu adalah pointer ke objek javascript lain. Jadi, kedua pointer tersebut menunjuk ke objek yang sama.Coba ini:
Anda juga bisa melakukan penyalinan mendalam objek. Lihat pertanyaan ini dan Anda akan menemukan yang terbaik untuk Anda.
sumber
state.c
adalah referensi, dan referensi sedang disalin dengan baik. Redux menginginkan bentuk keadaan yang dinormalisasi, yang berarti menggunakan id alih-alih referensi ketika negara bagian bersarang. Lihat reduxBagaimana dengan ini:
Itu menyaring kunci yang harus dihapus kemudian membangun objek baru dari kunci yang tersisa dan objek awal. Idenya dicuri dari program reaksi luar biasa Tyler McGinnes.
JSBin
sumber
Juga, jika mencari toolkit pemrograman fungsional, lihat Ramda .
sumber
Anda dapat menggunakan pembantu Ketidakmampuan untuk membatalkan pengaturan atribut, dalam kasus Anda:
sumber
Pada 2019, opsi lain adalah menggunakan
Object.fromEntries
metode ini. Sudah mencapai tahap 4.Yang menyenangkan tentang ini adalah bahwa ia menangani kunci integer dengan baik.
sumber
Mudah dengan Immutable.js :
deskripsi deleteIn ()
sumber
Masalah yang Anda hadapi adalah Anda tidak mengkloning keadaan awal Anda secara mendalam. Jadi, Anda memiliki salinan dangkal.
Anda dapat menggunakan operator spread
Atau mengikuti kode yang sama
sumber
Saya biasanya menggunakan
Saya menyadari ini tidak benar-benar menghapus properti tetapi untuk hampir semua tujuan 1 secara fungsional setara. Sintaks untuk ini jauh lebih sederhana daripada alternatif yang saya rasa merupakan tradeoff yang cukup bagus.
1 Jika Anda menggunakan
hasOwnProperty()
, Anda harus menggunakan solusi yang lebih rumit.sumber
Saya menggunakan pola ini
tetapi dalam buku saya melihat pola lain
sumber
utilitas;))
tipe aksi
pencipta aksi
peredam
sumber
Seperti yang ditunjukkan dalam beberapa jawaban sudah, itu karena Anda mencoba untuk mengubah keadaan bersarang yaitu. satu tingkat lebih dalam. Solusi kanonik adalah dengan menambahkan peredam pada
x
tingkat negara:Peredam tingkat lebih dalam
Peredam tingkat asli
sumber