Mi chiedo se esiste un metodo più semplice in lodash per sostituire un elemento in una raccolta JavaScript? (Possibile duplicato ma non ho capito la risposta lì :)
Ho guardato la loro documentazione ma non sono riuscito a trovare nulla
Il mio codice è:
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);
});
Aggiornamento: l'oggetto che sto cercando di sostituire ha molte proprietà simili
{id: 1, Prop1: ..., Prop2: ... e così via}
Soluzione:
Grazie a dfsq ma ho trovato una soluzione adeguata all'interno di lodash che sembra funzionare bene ed è piuttosto ordinata e l'ho messa in un mixin poiché ho questo requisito in molti posti. 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));
Soluzione più veloce Come sottolineato da @dfsq, seguire è molto più veloce
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
per la partita.
_.findIndex
invece di _.find
ti lascerà cadere sia il secondo _.find
che il _.indexOf
. Stai ripetendo l'array 3 volte quando tutto ciò di cui hai bisogno è 1.