linkmore-design
Version:
๐ ๐lm็ปไปถๅบใ๐
92 lines (90 loc) โข 2.37 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = calc;
exports.reset = void 0;
function getSum(item, dataIndex) {
let sum = 0;
item.children.forEach(subItem => {
let value;
if (/\%/.test(`${subItem[dataIndex]}`)) {
value = Number(subItem[`${dataIndex}_sum`]);
} else {
value = Number(subItem[dataIndex]);
}
if (Number.isNaN(value)) {
return;
}
sum += value;
});
return sum;
}
// ๅ็ปๆฑๅ่ฎก็ฎ
function calc(item, needCalcKeys, history) {
if (item?.children?.length) {
needCalcKeys.forEach(dkey => {
if (!item.children || !item.children.length) {
return;
}
const [dataIndex, expression] = dkey;
item[`${dataIndex}_exp`] = expression;
if (expression === 'sum') {
const sum = getSum(item, dataIndex);
item[dataIndex] = Number(sum).toFixed(2);
} else if (expression === 'average') {
const sum = getSum(item, dataIndex);
item[dataIndex] = (sum / item.children.length).toFixed(2);
} else if (expression === 'max') {
let max = -Number.MAX_VALUE;
item.children.forEach(subItem => {
const value = Number(subItem[dataIndex]);
if (Number.isNaN(value)) {
return;
}
if (value > max) {
max = value;
}
});
if (max === -Number.MAX_VALUE) {
max = 0;
}
item[dataIndex] = max;
} else if (expression === 'min') {
let min = Number.MAX_VALUE;
item.children.forEach(subItem => {
const value = Number(subItem[dataIndex]);
if (Number.isNaN(value)) {
return;
}
if (value < min) {
min = value;
}
});
if (min === Number.MAX_VALUE) {
min = 0;
}
item[dataIndex] = min;
} else if (expression === 'percent') {
const sum = getSum(item, dataIndex);
history.push({
item,
dataIndex,
sum
});
}
});
}
}
const reset = (arr, dataIndex) => {
arr?.forEach(item => {
if (item?.children) {
reset(item?.children, dataIndex);
}
if (item.children) {
delete item[dataIndex];
delete item[`${dataIndex}_exp`];
}
});
};
exports.reset = reset;