es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Por qué no funciona la reasignación del elemento de parámetro en forEach?

Para el siguiente bloque de código:

 <!-- begin snippet: js hide: false console: true babel: false -->
 <!-- language: lang-js -->

const items = [
  { id: 1, name: 'one' },
  { id: 2, name: 'two' },
];

const changes = {
  name: 'hello'
}

items.forEach((item, i) => {
  item = {
    ...item,
    ...changes
  }
})

console.log(items) // items NO se vuelven a asignar con cambios

items.forEach((item, i) => {
  items[i] = {
    ...item,
    ...changes
  }
});

console.log(items) // items se vuelven a asignar con cambios
<!-- end snippet -->

¿Por qué al asignar valores directamente sobre la iteración del elemento no cambian los objetos en el array?

item = {
    ...item,
    ...changes
  }

¿Pero cambiarlo accediéndolo con el índice sí cambia los objetos en el array?

items2[i] = {
    ...item,
    ...changes
  }

¿Y cuál es la mejor forma de actualizar objetos en un array? ¿items2[i] es ideal?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Reasignar los valores directamente en la iteración del elemento no cambia los objetos en el array porque sólo reasigna la variable local item a un nuevo objeto con las propiedades originales y los cambios especificados en el objeto changes. Esto no afecta la referencia del objeto en el array items.

    Sin embargo, cambiarlo accediendo con el índice sí cambia los objetos en el array porque modifica directamente la referencia del objeto en el array items en ese índice.

    La mejor manera de actualizar objetos en un array depende del caso de uso específico y los requisitos. Utilizar items2[i] para modificar directamente la referencia del objeto en el array puede funcionar, pero no siempre es la mejor opción. Otras opciones incluyen utilizar Array.map() para crear un nuevo array con objetos actualizados, utilizar bibliotecas o frameworks que proporcionen utilidades para manipular arrays o implementar lógica personalizada para actualizar los objetos según criterios específicos.

Comments are closed.