Je me demande s'il existe une méthode plus simple dans lodash pour remplacer un élément dans une collection JavaScript? (Possible duplicata mais je n'ai pas compris la réponse :)
J'ai regardé leur documentation mais je n'ai rien trouvé
Mon code est:
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);
});
Mise à jour: l'objet que j'essaie de remplacer a de nombreuses propriétés comme
{id: 1, Prop1: ..., Prop2: ..., et ainsi de suite}
Solution:
Merci à dfsq, mais j'ai trouvé une solution appropriée dans lodash qui semble fonctionner correctement et qui est assez soignée et je la mets également dans un mixin puisque j'ai cette exigence à de nombreux endroits. 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));
Solution plus rapide Comme l'a souligné @dfsq, suivre est beaucoup plus rapide
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
pour le match.
_.findIndex
au lieu de _.find
vous permettra de supprimer à la fois le second _.find
et le _.indexOf
. Vous parcourez le tableau 3 fois alors que tout ce dont vous avez besoin est de 1.