2016-02-04 22 views
18

Ho una matrice di oggetti. Voglio trovare da qualche campo, e poi cambiarlo:Javascript ES6/ES5 trova nella matrice e cambia

var item = {...} 
var items = [{id:2}, {id:2}, {id:2}]; 

var foundItem = items.find(x => x.id == item.id); 
foundItem = item; 

voglio che cambiare l'oggetto originale. Come? (Non mi preoccupo se sarà in lodash troppo)

risposta

40

È possibile utilizzare findIndex per trovare l'indice nella matrice dell'oggetto e sostituirlo se necessario:

var item = {...} 
var items = [{id:2}, {id:2}, {id:2}]; 

var foundIndex = items.findIndex(x => x.id == item.id); 
items[foundIndex] = item; 

Ciò presuppone ID univoci. Se gli ID sono duplicati (come nel tuo esempio), è probabilmente meglio se si utilizza forEach:

items.forEach((element, index) => { 
    if(element.id === item.id) { 
     items[index] = item; 
    } 
}); 
+12

o 'items.map (x => x.id == item.id? item: x) '... – georg

+5

@georg Restituisce comunque un nuovo array. – CodingIntrigue

+0

La funzione => non funzionerà in IE11. Recentemente morso da questo. –

9

Il mio approccio migliore è:

var item = {...} 
var items = [{id:2}, {id:2}, {id:2}]; 

items[items.findIndex(el => el.id === item.id)] = item; 

di riferimento per findIndex

E nel caso in cui si non si desidera sostituire con un nuovo oggetto, ma per copiare i campi di item, è possibile utilizzare Object.assign:

Object.assign(items[items.findIndex(el => el.id === item.id)], item)

in alternativa con .map():

Object.assign(items, items.map(el=> el.id === item.id? item : el))

+0

Si prega di collegare a una pagina inglese se la domanda originale era in inglese. Inoltre, questo esempio presuppone che l'oggetto sia sempre trovato. – raarts

+0

Puoi sempre racchiuderlo in un'espressione try catch quindi ... giusto? –

1

Un altro approccio è quello di utilizzare splice.

Nel caso si stia lavorando con framework reattivi, si aggiornerà la "vista", l'array "sapendo" che lo si è aggiornato.

Risposta:

var item = {...} 
var items = [{id:2}, {id:2}, {id:2}]; 

let foundIndex = items.findIndex(element => element.id === item.id) 
items.splice(foundIndex, 1, item) 

E nel caso in cui si desidera modificare solo un valore, è possibile utilizzare la funzione find:

// Retrieve item and assign ref to updatedItem 
let updatedItem = items.find((element) => { return element.id === item.id }) 

// Modify object property 
updatedItem.aProp = ds.aProp 
Problemi correlati