J'ai un tableau d'objets. Je veux trouver par un domaine, 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 que cela change l'objet original. Comment? (Je ne me soucie pas si ce sera dans lodash aussi)
Vous pouvez utiliser findIndex pour rechercher l'index dans le tableau de l'objet et le remplacer si nécessaire:
var item = {...}
var items = [{id:2}, {id:2}, {id:2}];
var foundIndex = items.findIndex(x => x.id == item.id);
items[foundIndex] = item;
Cela suppose des identifiants uniques. Si vos identifiants sont dupliqués (comme dans votre exemple), il vaut probablement mieux utiliser forEach:
items.forEach((element, index) => {
if(element.id === item.id) {
items[index] = item;
}
});
Ma meilleure approche est:
var item = {...}
var items = [{id:2}, {id:2}, {id:2}];
items[items.findIndex(el => el.id === item.id)] = item;
Référence pour findIndex
Et si vous ne voulez pas remplacer par un nouvel objet, mais plutôt copier les champs de item
, vous pouvez utiliser Object.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))
Une autre approche consiste à utiliser splice .
La méthode
splice()
modifie le contenu d'un tableau en supprimant ou en remplaçant des éléments existants et/ou en ajoutant de nouveaux éléments en place .
N.B: Si vous travaillez avec des frameworks réactifs, il mettra à jour la "vue", votre tableau "sachant" que vous l'avez mis à jour.
Répondre :
var item = {...}
var items = [{id:2}, {id:2}, {id:2}];
let foundIndex = items.findIndex(element => element.id === item.id)
items.splice(foundIndex, 1, item)
Et si vous souhaitez uniquement modifier la valeur d'un élément, vous pouvez utiliser la fonction rechercher :
// Retrieve item and assign ref to updatedItem
let updatedItem = items.find((element) => { return element.id === item.id })
// Modify object property
updatedItem.aProp = ds.aProp
Peut être utilisé Filtre .
const list = [{id:0}, {id:1}, {id:2}];
let listCopy = [...list];
let filteredDataSource = listCopy.filter((item) => {
if (item.id === 1) {
item.id = 12345;
}
return item;
});
console.log(filteredDataSource);
Tableau [Object {id: 0}, Object {id: 12345}, Object {id: 2}]