Javascript-форум (https://javascript.ru/forum/)
-   Библиотеки/Тулкиты/Фреймворки (https://javascript.ru/forum/library-toolkit-framework/)
-   -   Массив объектов (https://javascript.ru/forum/library-toolkit-framework/44352-massiv-obektov.html)

doox911 16.01.2014 19:45

Массив объектов
 
Доброго времени суток! Уважаемые Форумчане!

У меня такая задача:

Мне необходимо создать массив объектов.
var mas_tree = [];

Массив инициализирован. Массив будет хранить в каждой ячейки - объект. Объект имеет вид:
var tree = {
 tree_id:'',
 tree_type:'',
 tree_quality:'',
 tree_diametr:''
};


Теперь мне необходимо собрать информацию. Собрали! По консолю проверил. Длалее необходимо написать функцию, которая будет заносить этот объект в массив. Функция вызывается по клику на объекте(div).

Код:

<div id="button" onclick="data_tree();">Добавить</div>
Вот функция:

function data_tree(){
      tree.tree_id = id_tree;
      tree.tree_type = insert_t_t;
      tree.tree_quality = insert_t_q;
      tree.tree_diametr = diametr;
      mas_tree[id_tree-1] = tree; 
   }


Теперь вкусненькое. В каждую ячейку массива заносятся элементы(Объект). Но, все записи затираются последней. Т.е., записали 6 объектов, получилось 6 ячеек(0-5). Все записи идентичны 5 ячейки. Почему?)

За ранее спасибо.

рони 16.01.2014 20:06

doox911,
var mas_tree = [];
var tree = {
 tree_id:''
};
var n = 0;
function data_tree(){
      tree.tree_id = n;
      mas_tree[n++] = tree;
   }
data_tree()
data_tree()
alert(JSON.stringify(mas_tree))

почувствуйте разницу
var mas_tree = [];
	var n = 0;

	function data_tree() {
	    var tree = {
	        tree_id: ''
	    };
	    tree.tree_id = n;
	    mas_tree[n++] = tree;
	}
	data_tree()
	 data_tree()
	 alert(JSON.stringify(mas_tree))

doox911 16.01.2014 20:27

Цитата:

Сообщение от рони (Сообщение 292506)
doox911,
var mas_tree = [];
var tree = {
 tree_id:''
};
var n = 0;
function data_tree(){
      tree.tree_id = n;
      mas_tree[n++] = tree;
   }
data_tree()
data_tree()
alert(JSON.stringify(mas_tree))

почувствуйте разницу
var mas_tree = [];
	var n = 0;

	function data_tree() {
	    var tree = {
	        tree_id: ''
	    };
	    tree.tree_id = n;
	    mas_tree[n++] = tree;
	}
	data_tree()
	 data_tree()
	 alert(JSON.stringify(mas_tree))

Я понял так, что при каждом вызове функции объект инициализируется заново? Но почему все записи в массиве записывает идентично последней? Как это происходит?

рони 16.01.2014 20:34

doox911,
потому что все ссылки в вашем случае ведут на один и тотже обьект - поэтому они одинаковое содержимое и показывают.

во втором примере обьекты каждый раз разные(новые) поэтому и ссылки ведут на разные обьекты с разным содержимым

doox911 16.01.2014 20:52

Цитата:

Сообщение от рони (Сообщение 292511)
doox911,
потому что все ссылки в вашем случае ведут на один и тотже обьект - поэтому они одинаковое содержимое и показывают.

во втором примере обьекты каждый раз разные(новые) поэтому и ссылки ведут на разные обьекты с разным содержимым

Прошу прощения за тему не в том разделе.

С объектом ладно, хотя Я ж каждый раз нажимая на див присваиваю его полям разные значения. Но почему в массиве то затираются? Индексы ж меняются.

Просто может Я вас не понимаю.

Каждый раз(при вызове функции) индекс увеличивается на один. Как Я понимаю этот же объект, но с другими значениями в свойствах, записывается в ячейку. Или вот, мысля. Каждая новая ячейка хранит ссылку на объект, а не сам объект?

рони 16.01.2014 22:35

Цитата:

Сообщение от doox911
Каждая новая ячейка хранит ссылку на объект, а не сам объект?

да

doox911 16.01.2014 22:36

Цитата:

Сообщение от рони (Сообщение 292533)
да

Спасибо.


Часовой пояс GMT +3, время: 18:57.