javascript title - Alterar y asignar objeto sin efectos secundarios




html css (7)

Actualmente tengo el siguiente código:

var myArray = [];
var myElement = {
  id: 0,
  value: 0
}

myElement.id = 0;
myElement.value = 1;
myArray[0] = myElement;

myElement.id = 2;
myElement.value = 3;
myArray[1] = myElement;

El problema es que cuando cambio el valor de id y value para mi segundo elemento, los valores también cambian en el primer elemento. ¿Hay alguna manera de seguir añadiendo nuevos elementos sin que cambie el valor de los valores previamente insertados en la matriz?


Answers

Tendrás el mismo objeto dos veces en tu matriz, porque los valores de los objetos se pasan por referencia. Tienes que crear un nuevo objeto como este

myElement.id = 244;
myElement.value = 3556;
myArray[0] = $.extend({}, myElement); //for shallow copy or
myArray[0] = $.extend(true, {}, myElement); // for deep copy

o

myArray.push ({id: 24, valor: 246});


Pruebe esto en su lugar:

var myArray = [];

myArray.push({ id: 0, value: 1 });
myArray.push({ id: 2, value: 3 });

o esto no funcionará para su situación?


Los objetos se pasan por referencia. Para crear un nuevo objeto, sigo este enfoque.

//Template code for object creation.
function myElement(id, value) {
    this.id = id;
    this.value = value;
}
var myArray = [];

//instantiate myEle
var myEle = new myElement(0, 0);
//store myEle
myArray[0] = myEle;

//Now create a new object & store it
myEle = new myElement(0, 1);
myArray[1] = myEle;

Este es un caso de libro de texto para una función de constructor :

var myArray = [];

function myElement(id, value){
    this.id = id
    this.value = value
}

myArray[0] = new myElement(0,1)
myArray[1] = new myElement(2,3)
// or myArray.push(new myElement(1, 1))

Si está utilizando jQuery, puede usar extend

myElement.id =0;
myElement.value=1;
myArray[0] = $.extend({}, myElement);

myElement.id = 2;
myElement.value = 3;
myArray[1] = $.extend({}, myElement);

Eso es porque los valores de los objetos se pasan por referencia. Puedes clonar el objeto así:

var myArray = [];
var myElement = {
  id: 0,
  value: 0
}

myElement.id =0;
myElement.value=1;
myArray[0] = myElement;

var obj = {};
obj = clone(myElement);
obj.id = 2;
obj.value = 3; 

myArray[1] = obj;

function clone(obj){
  if(obj == null || typeof(obj) != 'object')
    return obj;

  var temp = new obj.constructor(); 
  for(var key in obj)
    temp[key] = clone(obj[key]);

  return temp;
}    

console.log(myArray[0]);
console.log(myArray[1]);

Resultado:

 - id: 0
 - value: 1
 - id: 2
 - value: 3

Para hacerlo corto:

Node.js es adecuado para aplicaciones que tienen muchas conexiones simultáneas y cada solicitud solo necesita muy pocos ciclos de CPU, porque el bucle de eventos (con todos los demás clientes) se bloquea durante la ejecución de una función.

Un buen artículo sobre el bucle de eventos en Node.js es el blog de tecnología de Mixu: Cómo entender el bucle de eventos node.js.





javascript