@korund1

Обращение к свойству объекта через переменную в JavaScript — как правильно?

Для теста написал следующий код
var num = ['num0', 'num1', 'num2'];
var sub_data = {
	foo: 0,
	bar: 5
};
var data = {
	val : 0,
	nums : {
		num0 : sub_data,
		num1 : sub_data,
		num2 : sub_data
	}
};
var d = {
	num0 : {
		foo : 9,
		bar : 1
	},
	num1 : {
		foo : 8,
		bar : 2
	},
	num2 : {
		foo : 7,
		bar : 3
	}
}

console.log(JSON.stringify(data) + "\n");
data.nums[num[1]].bar = d[num[2]].bar;
console.log(JSON.stringify(data));

выполняю в nodejs получаю следующее :

korund@q:~/prog/prophet/test$ nodejs array_object.js
{"val":0,"nums":{"num0":{"foo":0,"bar":5},"num1":{"foo":0,"bar":5},"num2":{"foo":0,"bar":5}}}

{"val":0,"nums":{"num0":{"foo":0,"bar":3},"num1":{"foo":0,"bar":3},"num2":{"foo":0,"bar":3}}}

Тест в Firefox даёт тот же результат.
Почему меняются все свойства объекта(num0,num1 b num2), а не одно, на который указывает индекс (num1)?
Что я упустил, как сделать это правильно,с такой структурой данных ?
  • Вопрос задан
  • 3438 просмотров
Решения вопроса 2
metamorph
@metamorph
sub_data у Вас передается по ссылке (а не по значению) поэтому изменения отображаются везде.

Попробуйте клонировать объект перед присваиванием.
Ответ написан
Потому что в data в объекте nums под всеми ключами будет лежать один и тот же объект.
var data = {
	val : 0,
	nums : {
		num0 : sub_data,
		num1 : sub_data,
		num2 : sub_data
	}
};

Этот код не "скопировать в num0, num1 и num2 объект sub_data", а "положить в поля "num0, num1, num2 ссылку на один и тот же объект sub_data"
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы