
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
const chartDataTransform = {
/**
* rowdata를 사용자 선택에 맞게 반환
* @param rowdata : 원본 데이터
* @param x : x축 객체 데이터
* @param yArr : y축 배열 데이터
*/
createData: function(rowdata, xAxisList, yAxisList, group){
let resultArr = [];
let x;
//x축 객체 배열 데이터를 가져와서 columnNm 값을 가져옴
if(xAxisList.length !== 0){
x = xAxisList[0].columnIdx;
}
//y축 객체 배열 데이터를 가져와서 columnNm 값을 배열로 가져옴
let yArr = yAxisList.map(field => {
return {
valNm: field.columnNm,
valIndex: field.columnIdx
}
});
if (yArr.length > 0) {
// 반복문을 통해 y축의 데이터를 가져와서 datalist에 추가
for(let i = 0; i < rowdata.length; i++) {
let data = {
categoryData: rowdata[i][x]
}
// data에 y축의 다중데이터 추가
yArr.forEach(field => {
const fieldName = field.valNm;
if(!data[fieldName]) {
data[fieldName] = 0;
}
data[fieldName] += Number(rowdata[i][field.valIndex]);
});
// group 추가
if(group !== undefined && group !== ""){
data.group = rowdata[i][group];}
resultArr.push(data);
}
}
return resultArr;
},
/**
* 변환된 데이터 그룹화
* @param data : 변환된 데이터
* @param yArr : y축 카테고리 배열 데이터
*/
dataGrouping: function(data, yArr){
if (!Array.isArray(data) || !data) {
return {};
}
return data.reduce((acc, cur) => {
if (!acc[cur.categoryData]) {
acc[cur.categoryData] = {};
// 각 필드 초기화
yArr.forEach(field => {
acc[cur.categoryData][field.valNm] = { values: [], sum: 0, min: Infinity, max: -Infinity, count: 0 };
});
}
// 각 필드별 합계 계산
yArr.forEach(field => {
const fieldName = field.valNm;
// cur[fieldName]이 배열인지 확인하고, 아니라면 배열로 만듦
let values = Array.isArray(cur[fieldName]) ? cur[fieldName] : [cur[fieldName]];
values.forEach(value => {
acc[cur.categoryData][fieldName].values.push(value);
acc[cur.categoryData][fieldName].sum += value;
acc[cur.categoryData][fieldName].min = Math.min(acc[cur.categoryData][fieldName].min, value);
acc[cur.categoryData][fieldName].max = Math.max(acc[cur.categoryData][fieldName].max, value);
acc[cur.categoryData][fieldName].count += 1;
});
});
return acc;
}, {});
},
/**
* 데이터 계산 값으로 가공 (min, max, sum, avg)
* @param groupData : 그룹화된 데이터
* @param selectedCal : 사용자가 선택한 계산 값
*/
calculateSetting: function(groupData, selectedCal) {
let result = Object.keys(groupData).map(categoryData => {
const result = { categoryData: categoryData };
Object.keys(groupData[categoryData]).forEach(fieldName => {
const fieldData = groupData[categoryData][fieldName];
switch (selectedCal) {
case "sum":
result[fieldName] = fieldData.sum;
break;
case "avg":
result[fieldName] = fieldData.sum / fieldData.count;
break;
case "min":
result[fieldName] = fieldData.min;
break;
case "max":
result[fieldName] = fieldData.max;
break;
}
});
return result;
});
return result;
},
/**
* 데이터 필터링
* 선택 된 그룹의 데이터로 가공
*/
setFilteringData : function(dataList ,subGroupArr, selectedSubGroup){
// groupSubArr에서 selectedSubGroup의 index를 찾아서 그 columnNm을 찾아옴
const selectedSubGroupNm = subGroupArr.find(column => column.index === Number(selectedSubGroup)).columnNm;
return dataList.filter(data => data.group === selectedSubGroupNm);
},
/**
* 음수 차트 데이터 처리
*/
convertValuesToNegative: function(data, fieldNm){
// 데이터 리스트를 순회하며 각 객체의 값을 확인
let test = data.forEach(obj => {
obj[fieldNm] = -Math.abs(obj[fieldNm]);
});
return test;
},
}
export default chartDataTransform;