Tengo una gran variedad de objetos. Quiero buscar por algún campo, y luego cambiarlo:
var item = {...}
var items = [{id:2}, {id:2}, {id:2}];
var foundItem = items.find(x => x.id == item.id);
foundItem = item;
Quiero que cambie el objeto original. ¿Cómo? (No me importa si también estará en lodash)
javascript
arrays
ecmascript-6
lodash
usuario3712353
fuente
fuente
item
contiene unaid
clave? ¿O le importaría tener la identificación y todas las propiedades delitem
objeto en la entrada de la matriz?Respuestas:
Puede usar findIndex para buscar el índice en la matriz del objeto y reemplazarlo según sea necesario:
Esto supone identificaciones únicas. Si sus ID están duplicadas (como en su ejemplo), probablemente sea mejor si usa forEach:
fuente
let
palabras clave en lugar devar
map
que usa @georg. Se requiere menos gimnasia mental para descubrir qué está pasando. Vale la pena la línea extra de código.Mi mejor enfoque es:
Referencia para findIndex
Y en caso de que no desee reemplazar con un nuevo objeto, sino que copie los campos
item
, puede usarObject.assign
:Object.assign(items[items.findIndex(el => el.id === item.id)], item)
como alternativa con
.map()
:Object.assign(items, items.map(el => el.id === item.id? item : el))
Enfoque funcional :
No modifique la matriz, use una nueva, para no generar efectos secundarios.
fuente
try/catch
, pero no debería, porque no encontrar el elemento no es un caso excepcional; es un caso estándar que debe tener en cuenta al verificar el valor de retorno defindIndex
y luego solo actualizar la matriz cuando se encontró el elemento.Otro enfoque es usar el empalme .
NB: en caso de que esté trabajando con marcos reactivos, actualizará la "vista", su matriz "sabrá" que la ha actualizado.
Responder :
Y en caso de que solo desee cambiar el valor de un elemento, puede usar la función de búsqueda :
fuente
Dado un objeto cambiado y una matriz:
Actualice la matriz con el nuevo objeto iterando sobre la matriz:
fuente
Se puede utilizar filtro .
fuente
trabajó para mi
fuente
Mientras que la mayoría de las respuestas existentes son geniales, me gustaría incluir una respuesta usando un bucle for tradicional, que también debería considerarse aquí. El OP solicita una respuesta que es compatible con ES5 / ES6, y se aplica el bucle for tradicional :)
El problema con el uso de funciones de matriz en este escenario es que no mutan objetos, pero en este caso, la mutación es un requisito. La ganancia de rendimiento del uso de un bucle for tradicional es solo una bonificación (enorme).
Aunque soy un gran admirador de las funciones de matriz, no permita que sean la única herramienta en su caja de herramientas. Si el propósito es mutar la matriz, no son la mejor opción.
fuente
One-liner con operador de propagación.
fuente