Que se supone que vendrá 1, 2, 3 pero que viene 3, 3, 3, ¿cómo solucionarlo? Actualización automática de JavaScript

let test = [ { id: 1 } ];
let test2 = [
  { id: 1 },
  { id: 2 },
  { id: 3 }
];

let x = []

test2.forEach(i => {
  test[0].id = i.id;
  x.push(test[0])
});

console.log(x)
2
sivu 13 jul. 2021 a las 10:38

3 respuestas

La mejor respuesta

Dado que está presionando el mismo objeto 3 veces y al final del ciclo, tendrá 3 referencias del mismo objeto, es decir, test[0]

Puede utilizar sintaxis de propagación para copiar todo propiedades del objeto

let test = [{ id: 1 }];
let test2 = [{ id: 1 }, { id: 2 }, { id: 3 }];

let x = [];

test2.forEach((i) => {
  test[0].id = i.id;
  x.push({ ...test[0] });
});

console.log(x);
1
decpk 13 jul. 2021 a las 07:46

Utilice la operadora de propagación:

x.push({ ...test[0] })

Básicamente, necesita clonar superficialmente la matriz porque es un objeto; forEach creará 3 referencias al mismo objeto test[0] al comienzo de la llamada.

1
Alec 13 jul. 2021 a las 07:46

Está pasando la misma referencia a la matriz cada vez. También está actualizando ese mismo valor, es decir, test[0].

Entonces, al final, tiene una matriz con tres elementos, los 3 apuntando al mismo objeto cuya propiedad id ha actualizado al valor final - test2[2].id.

Puede insertar directamente un objeto con la propiedad id correcta. No necesitará una matriz de prueba adicional ya que está creando su objeto y empujándolo sobre la marcha.

let test = [ { id: 1 } ];
let test2 = [
  { id: 1 },
  { id: 2 },
  { id: 3 }
];

let x = []

test2.forEach(i => {
  x.push({ id : i.id })
});

console.log(x)
0
Tushar Shahi 13 jul. 2021 a las 07:51