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);
}
};
_.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.