Saya ingin tahu apakah ada metode yang lebih sederhana dalam lodash untuk mengganti item dalam koleksi JavaScript? (Kemungkinan duplikat tapi saya tidak mengerti jawabannya di sana :)
Saya melihat dokumentasi mereka tetapi tidak dapat menemukan apa pun
Kode saya adalah:
var arr = [{id: 1, name: "Person 1"}, {id:2, name:"Person 2"}];
// Can following code be reduced to something like _.XX(arr, {id:1}, {id:1, name: "New Name"});
_.each(arr, function(a, idx){
if(a.id === 1){
arr[idx] = {id:1, name: "Person New Name"};
return false;
}
});
_.each(arr, function(a){
document.write(a.name);
});
Pembaruan: Objek yang saya coba ganti memiliki banyak properti seperti
{id: 1, Prop1: ..., Prop2: ..., dan seterusnya}
Larutan:
Terima kasih kepada dfsq tapi saya menemukan solusi yang tepat di dalam lodash yang tampaknya berfungsi dengan baik dan cukup rapi dan saya memasukkannya ke dalam mixin juga karena saya memiliki persyaratan ini di banyak tempat. JSBin
var update = function(arr, key, newval) {
var match = _.find(arr, key);
if(match)
_.merge(match, newval);
else
arr.push(newval);
};
_.mixin({ '$update': update });
var arr = [{id: 1, name: "Person 1"}, {id:2, name:"Person 2"}];
_.$update(arr, {id:1}, {id:1, name: "New Val"});
document.write(JSON.stringify(arr));
Solusi Lebih Cepat Seperti yang ditunjukkan oleh @dfsq, mengikuti adalah cara yang lebih cepat
var upsert = function (arr, key, newval) {
var match = _.find(arr, key);
if(match){
var index = _.indexOf(arr, _.find(arr, key));
arr.splice(index, 1, newval);
} else {
arr.push(newval);
}
};
javascript
lodash
Vishal Seth
sumber
sumber
_.findIndex
untuk pertandingan._.findIndex
alih-alih_.find
akan membiarkan Anda menghapus yang kedua_.find
dan yang kedua_.indexOf
. Anda mengulangi array sebanyak 3 kali ketika yang Anda butuhkan adalah 1.Jawaban:
Dalam kasus Anda, yang perlu Anda lakukan adalah menemukan objek dalam array dan menggunakan
Array.prototype.splice()
metode, baca detail selengkapnya di sini :sumber
indexOf
akan sangat cepat (itu akan menggunakan browser asli Array.prototype.indexOf). Tapi bagaimanapun, senang Anda menemukan solusi yang cocok untuk Anda._.findIndex
? Maka Anda tidak perlu menggunakan_.indexOf
.Sepertinya solusi paling sederhana untuk menggunakan ES6
.map
atau lodash_.map
:Ini memiliki efek yang bagus untuk menghindari mutasi array asli.
sumber
[ES6] Kode ini berfungsi untuk saya.
sumber
updatedItem
array Anda jika tidak termasuk item dengan yang samaid
.Sekarang mari kita uji kinerja untuk semua metode:
Tampilkan cuplikan kode
sumber
Anda juga dapat menggunakan findIndex dan memilih untuk mencapai hasil yang sama:
sumber
Seiring berjalannya waktu Anda harus merangkul pendekatan yang lebih fungsional di mana Anda harus menghindari mutasi data dan menulis kecil, fungsi tanggung jawab tunggal. Dengan standar ECMAScript 6, Anda dapat menikmati paradigma pemrograman fungsional dalam JavaScript dengan yang disediakan
map
,filter
danreduce
metode. Anda tidak perlu tempat lain, garis bawah atau apa lagi untuk melakukan hal-hal paling mendasar.Di bawah ini saya telah menyertakan beberapa solusi yang diusulkan untuk masalah ini untuk menunjukkan bagaimana masalah ini dapat diselesaikan dengan menggunakan fitur bahasa yang berbeda:
Menggunakan peta ES6:
Versi rekursif - setara dengan pemetaan:
Membutuhkan perusakan dan penyebaran array .
Ketika urutan larik akhir tidak penting, Anda dapat menggunakan struktur data
object
sebagai HashMap . Sangat berguna jika Anda sudah memiliki koleksi kunci sebagaiobject
- jika tidak, Anda harus mengubah representasi Anda terlebih dahulu.Membutuhkan penyebaran sisa objek , nama properti yang dihitung, dan Object.entries .
sumber
Jika Anda hanya mencoba mengganti satu properti, lodash
_.find
dan_.set
seharusnya sudah cukup:sumber
Jika titik penyisipan objek baru tidak perlu cocok dengan indeks objek sebelumnya maka cara paling sederhana untuk melakukan ini dengan lodash adalah dengan menggunakan
_.reject
dan kemudian mendorong nilai-nilai baru ke dalam array:Jika Anda memiliki beberapa nilai yang ingin Anda ganti dalam satu pass, Anda dapat melakukan hal berikut (ditulis dalam format non-ES6):
sumber
Dengan menggunakan lodash unionDengan fungsi, Anda dapat melakukan gerakan sederhana ke sebuah objek. Dokumentasi menyatakan bahwa jika ada kecocokan, itu akan menggunakan array pertama. Bungkus objek Anda yang diperbarui dalam [] (array) dan letakkan sebagai array pertama dari fungsi gabungan. Cukup tentukan logika pencocokan Anda dan jika ditemukan akan menggantinya dan jika tidak maka akan menambahkannya
Contoh:
sumber
Varian tidak terlalu buruk)
sumber
sumber
Jika Anda sedang mencari cara untuk mengubah koleksi secara permanen (seperti saya ketika saya menemukan pertanyaan Anda), Anda mungkin dapat melihat pembantu-ketidakberdayaan , sebuah perpustakaan yang bercabang dari utilitas Bereaksi asli. Dalam kasus Anda, Anda akan mencapai apa yang Anda sebutkan melalui yang berikut:
sumber
Anda bisa melakukannya tanpa menggunakan lodash.
sumber
Abadi , cocok untuk
ReactJS
:Menganggap:
Item yang diperbarui adalah yang kedua dan nama diubah menjadi
Special Person
:Petunjuk : yang lodash memiliki alat yang berguna tapi sekarang kami memiliki beberapa dari mereka di Ecmascript6 +, jadi saya hanya menggunakan
map
fungsi yang ada pada kedualodash
danecmascript6+
:sumber
Datang juga dan lakukan dengan cara itu.
Kalau mau kita bisa menggeneralisasikannya
sumber