nhb-toolbox
Version:
A versatile collection of smart, efficient, and reusable utility functions, classes and types for everyday development needs.
50 lines (49 loc) • 2.21 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.sumFieldDifference = sumFieldDifference;
exports.sumByField = sumByField;
exports.averageByField = averageByField;
exports.groupAndSumByField = groupAndSumByField;
exports.groupAndAverageByField = groupAndAverageByField;
const non_primitives_1 = require("../guards/non-primitives");
const basics_1 = require("../number/basics");
const helpers_1 = require("./helpers");
const transform_1 = require("./transform");
function sumFieldDifference(data, first, second, roundTo = 2) {
if (!(0, non_primitives_1.isValidArray)(data))
return 0;
const total = data?.reduce((acc, item) => {
return acc + ((0, helpers_1._getNumericProp)(item, first) - (0, helpers_1._getNumericProp)(item, second));
}, 0);
return (0, basics_1.roundNumber)(total, roundTo);
}
function sumByField(data, field, roundTo = 2) {
if (!(0, non_primitives_1.isValidArray)(data))
return 0;
const total = data?.reduce((acc, item) => acc + (0, helpers_1._getNumericProp)(item, field), 0);
return (0, basics_1.roundNumber)(total, roundTo);
}
function averageByField(data, field, roundTo = 2) {
if (!(0, non_primitives_1.isValidArray)(data))
return 0;
const total = data?.reduce((acc, item) => acc + (0, helpers_1._getNumericProp)(item, field), 0);
return (0, basics_1.roundNumber)(total / data.length, roundTo);
}
function groupAndSumByField(data, groupBy, sumBy, roundTo = 2) {
if (!(0, non_primitives_1.isValidArray)(data))
return [];
const groups = (0, transform_1.splitArrayByProperty)(data, groupBy);
const result = groups.map((group) => ({
[`${(0, helpers_1._resolveNestedKey)(group[0], groupBy)}`]: sumByField(group, sumBy, roundTo),
}));
return result;
}
function groupAndAverageByField(data, groupBy, averageBy, roundTo = 2) {
if (!(0, non_primitives_1.isValidArray)(data))
return [];
const groups = (0, transform_1.splitArrayByProperty)(data, groupBy);
const result = groups.map((group) => ({
[`${(0, helpers_1._resolveNestedKey)(group[0], groupBy)}`]: averageByField(group, averageBy, roundTo),
}));
return result;
}