Saya memiliki berbagai objek. Saya ingin mencari berdasarkan beberapa bidang, dan kemudian mengubahnya:
var item = {...}
var items = [{id:2}, {id:2}, {id:2}];
var foundItem = items.find(x => x.id == item.id);
foundItem = item;
Saya ingin mengubah objek asli. Bagaimana? (Saya tidak peduli apakah itu akan di lodash juga)
javascript
arrays
ecmascript-6
lodash
pengguna3712353
sumber
sumber
item
berisiid
kunci? atau apakah Anda keberatan memiliki id serta semua properti dariitem
objek dalam entri array?Jawaban:
Anda dapat menggunakan findIndex untuk menemukan indeks dalam array objek dan menggantinya sesuai kebutuhan:
Ini mengasumsikan ID unik. Jika ID Anda digandakan (seperti dalam contoh Anda), mungkin lebih baik jika Anda menggunakan forEach:
sumber
let
kata kunci daripadavar
map
yang menggunakan @georg. Senam mental yang lebih sedikit diperlukan untuk mengetahui apa yang terjadi. Layak dengan baris kode tambahan.Pendekatan terbaik saya adalah:
Referensi untuk findIndex
Dan jika Anda tidak ingin mengganti dengan objek baru, tetapi alih-alih menyalin bidang
item
, Anda dapat menggunakanObject.assign
:Object.assign(items[items.findIndex(el => el.id === item.id)], item)
sebagai alternatif dengan
.map()
:Object.assign(items, items.map(el => el.id === item.id? item : el))
Pendekatan fungsional :
Jangan memodifikasi array, gunakan yang baru, jadi Anda tidak menghasilkan efek samping
sumber
try/catch
, tetapi Anda tidak boleh, karena tidak menemukan elemen bukanlah kasus luar biasa; ini merupakan kasus standar yang harus Anda pertanggungjawabkan dengan memeriksa nilai balikfindIndex
dan kemudian hanya memperbarui array ketika elemen ditemukan.Pendekatan lain adalah dengan menggunakan sambungan .
NB: Jika Anda bekerja dengan kerangka kerja reaktif, itu akan memperbarui "view", array Anda "mengetahui" Anda telah memperbaruinya.
Jawaban:
Dan jika Anda hanya ingin mengubah nilai suatu item, Anda dapat menggunakan fungsi find :
sumber
Diberikan objek dan array yang diubah:
Perbarui array dengan objek baru dengan mengulangi array:
sumber
Mungkin menggunakan Filter .
sumber
bekerja untukku
sumber
Meskipun sebagian besar jawaban yang ada bagus, saya ingin memasukkan jawaban menggunakan tradisional untuk loop, yang juga harus dipertimbangkan di sini. OP meminta jawaban yang kompatibel dengan ES5 / ES6, dan tradisional untuk loop berlaku :)
Masalah dengan menggunakan fungsi array dalam skenario ini, adalah bahwa mereka tidak bermutasi objek, tetapi dalam kasus ini, mutasi adalah persyaratan. Keuntungan kinerja menggunakan loop tradisional untuk hanya bonus (besar).
Meskipun saya penggemar berat fungsi array, jangan biarkan mereka menjadi satu-satunya alat di kotak alat Anda. Jika tujuannya bermutasi array, mereka bukan yang paling cocok.
sumber
Satu-liner menggunakan operator spread.
sumber