Почему в данном случае в массив добавляется только последнее значение?

В массив добавляется всегда только последнее значение объекта objectInfo, хотя при выводе console.log все нормально.

for(let i = 0; i < dataJson.length; i++) {
	
	if(objectInfo.date != dataJson[i].date) {
		objectInfo.date = dataJson[i].date;
		arrInfo.push(objectInfo);
	}
  • Вопрос задан
  • 910 просмотров
Решения вопроса 1
rockon404
@rockon404
Frontend Developer
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@nonamemovich
Важно понимать отличие ссылочных типов данных(object) от значимых типов данных(number, string, boolean, undefined, null, symbol (в ECMAScript 6)) в javascript.

var a=6;
var b = a;


a и b будут указывать на разные участки памяти, изменение b не скажется на a.

var obj = {
  prop1: "value1",
  prop2: 123
}
var refObj = obj;


теперь obj и refObj это разные ссылки на один и тот же участок в памяти, присвоив refObj.prop1 = "valueChanged" вы измените содержимое участка памяти где размещено свойство объекта, и потому obj.prop1 == "valueChanged".
Однако важно понимать что refObj и obj разные ссылки пусть хоть и ссылаются на один и тот же объект, переназначение одной из ссылок никак не скажется на другой ссылке refObj = [1,2,3,4,5] (массивы в js тоже объекты определённой структуры),
obj всё также будет равен { prop1: "value1", prop2: 123}.

При
typeof dataJson[i].date != 'object'
или вам нужно было сохранить ссылки в массив arrInfo
можно просто пушить dataJson[i].date в массив.

var ignoreObj = new Map(); // Map может использовать в качестве key всё что угодно( number, string, object)
for(let i = 0; i < dataJson.length; i++) {
	if(!ignoreObj.has(dataJson[i].date)) {       // ignoreObj.has(obj) скажет был ли obj добавлен в ignoreObj
		arrInfo.push(dataJson[i].date);
		ignoreObj.set(dataJson[i].date, 1);    // запоминаем объект, чтобы повторно не добавлять в массив
	}
}

при typeof dataJson[i].date == 'object' изменение свойств dataJson[i].date скажется и на arrInfo.

Либо если вы хотели "запомнить" объекты в текущем состоянии выполнить копирование свойств dataJson[i].date в новый объект.

var ignoreObj = new Map(); 

for(let i = 0; i < dataJson.length; i++) {
	if(!ignoreObj.has(dataJson[i].date)) { 
		var clone = { date:{} };                     // объект для "клонирования"
		var clone.date = Object.assign({}, dataJson[i].date);         // непосредственно клонирование свойств <b>первого уровня</b> dataJson[i].date.
		arrInfo.push(clone);
		ignoreObj.set(dataJson[i].date, 1);  
	}
}

при таком варианте изменение свойств dataJson[i].date не изменит содержимого arrInfo.

Надеюсь я смог вам помочь, а не запутал ещё больше))).
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы