#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: []
});