2012-03-03 7 views
23

я в настоящее время быть_наст следующий код:Добавить новый объект в массив

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; 

Проблема заключается в том, что, когда я изменить значение идентификатора и значения при добавлении второго элемента значение также изменяется в первом элементе. Есть ли способ, которым я могу продолжать добавлять новые элементы без изменения значения ранее вставленных значений в массиве?

ответ

72

Попробуйте вместо этого:

var myArray = []; 

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

или это не работает в вашей ситуации?

+1

Ваш синтаксис испорчен. Вы не используете '=' внутри литерала объекта, как это, вы используете ':'. Хотя я согласен с этим подходом. –

+1

Упс, хороший улов. Исправлена. Благодаря! – kendaleiv

+0

@ kendaleiv Идеально он работал именно для моей ситуации, спасибо! – user1219627

0

Если вы используете JQuery, вы можете использовать extend

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

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

Это потому, что значения объекта передаются по ссылке. Вы можете клонировать объект так:

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

Результат:

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

объектов передаются по ссылке .. Для того, чтобы создать новый объект , я следую этому подходу ..

//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

Это учебный корпус для 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

Я уже реализовал другой ответ, но я согласен с тем, что это также хорошее решение. благодаря – user1219627

0

У вас будет один и тот же объект два раза в вашем массиве, потому что значения объекта передаются по ссылке. Вы должны создать новый объект, как этот

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

или

myArray.push ({ID: 24, стоимость: 246});

Смежные вопросы