
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 = {
selectColumnIndex(dataTable, column) {
for (let i = 0; i < dataTable.columnDatas.length; i++) {
if (column == dataTable.columnDatas[i]) {
return i;
}
}
return null;
},
/**
* rowdata를 사용자 선택에 맞게 반환
* @param rowdata : 원본 데이터
* @param x : x축 객체 데이터
* @param yArr : y축 배열 데이터
*/
createData: function (dataTable, xAxisList, yAxisList, group) {
let xAxis = null;
let yAxisArr = [];
let result = [];
if (dataTable.rowData.length > 0 && xAxisList.length > 0 && yAxisList.length > 0) {
xAxis = this.selectColumnIndex(dataTable, xAxisList[0]);
if (xAxis == null) {
return [];
}
for (let yAxis of yAxisList) {
let index = this.selectColumnIndex(dataTable, yAxis);
if (index == null) {
return [];
}
yAxisArr.push(
{
key: yAxis.columnNm,
idx: index,
}
);
}
for (let row of dataTable.rowData) {
let data = {
categoryData: row[xAxis],
}
for (let yArr of yAxisArr) {
if (!data[yArr.key]) {
data[yArr.key] = 0;
}
data[yArr.key] += Number(row[yArr.idx]);
}
if (group != null && group !== undefined && group !== "") {
data.group = row[group];
}
result.push(data);
}
}
return result;
},
/**
* 변환된 데이터 그룹화
* @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;