2013-10-25 2 views
0

У меня проблема в течение циклаНеправильное значение в течение цикла

var a={ name:""}; 
var nameList=['jack','luck']; 
var data=[]; 
for(var i=0;i<nameList.length;i++){ 
    a.name=nameList[i]; 
    data.push(a); 
} 
console.log(data) //output [Object { name="luck"}, Object { name="luck"}] 

, который я хочу данные [Объект {имя = «Гнездо»}, {имя объекта = «удачи»}].

И когда я изменил код на data.push({name:nameList[i]}) и data[i] = {name:nameList[i]} в цикле, они оба возвращают правильное значение, которое я ожидаю.

Может ли кто-нибудь сказать мне, в чем разница?

ответ

4

У вас есть только один объект, и вы неоднократно меняете его имя и нажимаете ссылку на него на массив. Вот как работают переменные в JavaScript; копирование выполняется по значению, а значение для объектов, удерживающих переменные, - это ссылка.

Вам нужно создать новый объект на каждой итерации.

for(var i=0;i<nameList.length;i++){ 
    a = { name: nameList[i] } 
    data.push(a); 
} 
+0

так что вы имеете в виду a.name = nameList [i] делает nameList [i] ссылкой на a.name? – chunterg

+0

Нет, я говорю, что 'a' всегда имеет один и тот же объект. Когда вы используете 'data.push (a)', вы помещаете ссылку на 'a' в свой массив. Это тот же самый объект **, следующий итерации, когда вы перезаписываете его имя. – meagar

4

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

var nameList = ['jack','luck']; 
var data = []; 
for(var i = 0; i < nameList.length; i++){ 
    data.push({name: nameList[i]}); // creates a new object each time thru the loop 
} 

или, если вы хотите, промежуточный объект (по другим причинам - нет необходимости для кода вы показан), он будет работать так:

var nameList = ['jack','luck']; 
var data = [], a; 
for(var i = 0; i < nameList.length; i++){ 
    a = {}; 
    a.name = nameList[i]; 
    data.push(a); 
} 

Обратите внимание, как a присваивается новый объект каждый раз через петлю так, что вы создаете и толкая в массив новый объект каждый раз.

0

Вы используете a в обоих элементах массива. Это тот же объект. Во второй раз, когда вы меняете имя, вы меняете его для обоих.

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