2012-03-03 24 views
23

Actualmente tengo el siguiente código:Añadir nuevo objeto a la matriz

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 valor cuando agrego el segundo elemento de 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?

Respuesta

72

probar este lugar:

var myArray = []; 

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

o será esto no funcionará para su situación?

+1

Su sintaxis está mal. Usted no usa '=' dentro de un objeto literal así, usted usa ':'. Aunque estoy de acuerdo con el enfoque. –

+1

Vaya, buena captura. Fijo. ¡Gracias! – kendaleiv

+0

@kendaleiv Perfecto funcionó exactamente para mi situación, ¡Gracias! – user1219627

0

Si estás usando jQuery, puede utilizar extend

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

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

Esto se debe a valores de objeto se pasan por referencia. Puede clonar el objeto de esta manera:

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 
0

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; 
16

Este es un caso de libro de texto para un constructor function:

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)) 
+0

Ya he implementado la otra respuesta, pero estoy de acuerdo en que esta es también una buena solución. Gracias – user1219627

0

Tendrá el mismo objeto dos veces en su matriz, porque los valores de los objetos se pasan por referencia. Hay que crear un nuevo objeto como éste

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});