J'ai un tableau d'objets. Je veux trouver par un champ, puis le changer:
var item = {...}
var items = [{id:2}, {id:2}, {id:2}];
var foundItem = items.find(x => x.id == item.id);
foundItem = item;
Je veux qu'il change l'objet d'origine. Comment? (Je m'en fiche si ce sera aussi en lodash)
javascript
arrays
ecmascript-6
lodash
utilisateur3712353
la source
la source
item
contient uneid
clé? ou cela vous dérange-t-il d'avoir l'id ainsi que toutes les propriétés de l'item
objet dans l'entrée du tableau?Réponses:
Vous pouvez utiliser findIndex pour rechercher l'index dans le tableau de l'objet et le remplacer si nécessaire:
Cela suppose des identifiants uniques. Si vos identifiants sont dupliqués (comme dans votre exemple), il est probablement préférable d'utiliser forEach:
la source
let
mot-clé au lieu devar
map
utilisé par @georg. Moins de gymnastique mentale nécessaire pour comprendre ce qui se passe. Vaut la ligne de code supplémentaire.Ma meilleure approche est:
Référence pour findIndex
Et au cas où vous ne voudriez pas remplacer par un nouvel objet, mais plutôt copier les champs de
item
, vous pouvez utiliserObject.assign
:Object.assign(items[items.findIndex(el => el.id === item.id)], item)
comme alternative avec
.map()
:Object.assign(items, items.map(el => el.id === item.id? item : el))
Approche fonctionnelle :
Ne modifiez pas le tableau, utilisez-en un nouveau pour ne pas générer d'effets secondaires
la source
try/catch
, mais vous ne devriez pas, car ne pas trouver l'élément n'est pas un cas exceptionnel; c'est un cas standard que vous devez prendre en compte en vérifiant la valeur de retour defindIndex
, puis en ne mettant à jour le tableau que lorsque l'élément a été trouvé.Une autre approche consiste à utiliser l' épissure .
NB: Si vous travaillez avec des frameworks réactifs, il mettra à jour la "vue", votre tableau "sachant" que vous l'avez mis à jour.
Répondre :
Et si vous souhaitez uniquement modifier la valeur d'un élément, vous pouvez utiliser la fonction de recherche :
la source
Étant donné un objet modifié et un tableau:
Mettez à jour le tableau avec le nouvel objet en itérant sur le tableau:
la source
Peut être utiliser Filter .
la source
travaillé pour moi
la source
Alors que la plupart des réponses existantes sont excellentes, j'aimerais inclure une réponse utilisant une boucle for traditionnelle, qui devrait également être considérée ici. L'OP demande une réponse compatible ES5 / ES6, et la boucle for traditionnelle s'applique :)
Le problème avec l'utilisation des fonctions de tableau dans ce scénario, est qu'elles ne mutent pas les objets, mais dans ce cas, la mutation est une exigence. Le gain de performance lié à l'utilisation d'une boucle for traditionnelle n'est qu'un (énorme) bonus.
Bien que je sois un grand fan des fonctions de tableau, ne les laissez pas être le seul outil de votre boîte à outils. Si le but est de faire muter le tableau, ils ne sont pas la meilleure solution.
la source
Monotouche utilisant un opérateur d'épandage.
la source