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

#javascript #arrays #json

#javascript #массивы #json

Вопрос:

У меня есть большой «главный объект» (objMaster), содержащий много данных.

У меня есть 3 отдельных объекта JSON (я знаю, не «технически» объекты) для 3 категорий, которые будут содержать некоторые данные, вычисленные из значений в objMaster. Давайте назовем их: objCategory1, objCategory2, objCategory3

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

 $(objMaster).each(function(j,v){    
   var myCat1data = objMaster[j].Cat1Completed / objMaster[j].Cat1Total ;
   var myCat2data = objMaster[j].Cat2Completed / objMaster[j].Cat2Total ;
   var myCat3data = objMaster[j].Cat3Completed / objMaster[j].Cat3Total ;

   objCategory1[j].data.push(myCat1data);       
   objCategory2[j].data.push(myCat2data);
   objCategory3[j].data.push(myCat3data);       
}); 
  

в результате получается objCategory1[j].данные получают значения для myCat1data, myCat2data и myCat3data, а не только значения для myCat1data. То же самое для objCategory2[j].data и objCategory3 [j].data.

Если я закомментирую отправку в objCategory2 и objCategory3, то objCategory1[j].данные получают только значения myCat1data.

 $(objMaster).each(function(j,v){    
   var myCat1data = objMaster[j].Cat1Completed / objMaster[j].Cat1Total ;
   var myCat2data = objMaster[j].Cat2Completed / objMaster[j].Cat2Total ;
   var myCat3data = objMaster[j].Cat3Completed / objMaster[j].Cat3Total ;

   objCategory1[j].data.push(myCat1data);       
   // objCategory2[j].data.push(myCat2data);
   // objCategory3[j].data.push(myCat3data);        
}); 
  

Есть идеи, что здесь происходит?

ОБНОВЛЕНИЕ: я инициализирую массивы категорий, используя аналогичную итерацию

 var objCategory1= [];
var objCategory2= [];
var objCategory3= [];

// create category dataset shells
$(objMaster).each(function(j,v){    

  var myDataSet = {
   label: mycategory,
   data: []
 }; 

 // push dataset shell to associated chart data objects
 objCategory1.push(myDataSet);
 objCategory2.push(myDataSet);
 objCategory3.push(myDataSet);
}); 
  

Комментарии:

1. Как .data инициализируются свойства? Если на то пошло, как objCategory инициализируются массивы?

2. Также не существует такого понятия, как объект JSON; это объекты JavaScript.

3. Можете ли вы показать инициализацию данных? Это массив?

4. Вы помещаете один и тот же объект «набора данных» во все три массива. .push() Операция не создает копию.

Ответ №1:

вместо такой инициализации

 var objCategory1= [];
var objCategory2= [];
var objCategory3= [];

// create category dataset shells
$(objMaster).each(function(j,v){    

  var myDataSet = {
   label: mycategory,
   data: []
 }; 

 // push dataset shell to associated chart data objects
 objCategory1.push(myDataSet);
 objCategory2.push(myDataSet);
 objCategory3.push(myDataSet);
}); 
  

можете ли вы попробовать это

 var objCategory1= [];
var objCategory2= [];
var objCategory3= [];

// create category dataset shells
$(objMaster).each(function(j,v){    
 objCategory1.push({ label: mycategoy, data: [] });
 objCategory2.push({ label: mycategoy, data: [] });
 objCategory3.push({ label: mycategoy, data: [] });
});
  

это инициализирует категории объектов с разными массивами данных

Ответ №2:

вы помещаете ссылку на один и тот же объект во все 3 массива objCategoryX:

 var myDataSet = {
   label: mycategory,
   data: []
 };     

 objCategory1.push(myDataSet);
 objCategory2.push(myDataSet);
 objCategory3.push(myDataSet);
  

вместо этого вам нужно создавать новые объекты для каждого использования:

 objCategory1.push({
       label: mycategory,
       data: []
     });
objCategory2.push({
       label: mycategory,
       data: []
     });
objCategory3.push({
       label: mycategory,
       data: []
     });