Ich frage mich, ob es in lodash eine einfachere Methode gibt, um ein Element in einer JavaScript-Sammlung zu ersetzen. (Mögliches Duplikat, aber ich habe die Antwort dort nicht verstanden :)
Ich sah mir ihre Unterlagen an, konnte aber nichts finden
Mein Code lautet:
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);
});
Update: Das Objekt, durch das ich ersetzen möchte, hat viele Eigenschaften wie
{id: 1, Prop1: ..., Prop2: ... und so weiter}
Lösung:
Dank dfsq habe ich aber in lodash eine richtige Lösung gefunden, die gut zu funktionieren scheint und ziemlich ordentlich ist, und ich habe sie auch in ein Mixin eingefügt, da ich diese Anforderung an vielen Stellen habe. 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));
Schnellere Lösung Wie von @dfsq hervorgehoben, ist das Folgen viel schneller
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
für Match verwenden.
_.findIndex
anstelle von _.find
sowohl die zweite _.find
als auch die zweite löschen _.indexOf
. Sie durchlaufen das Array dreimal, wenn Sie nur 1 benötigen.