web-dev-qa-db-fra.com

Javascript ES6 / ES5 trouver dans un tableau et changer

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)

78
user3712353

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;
    }
});
158
CodingIntrigue

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))

29
Soldeplata Saketos

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
9
Toodoo

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}]

4
katwal-Dipak