nhb-toolbox
Version:
A versatile collection of smart, efficient, and reusable utility functions, classes and types for everyday development needs.
43 lines (42 loc) • 1.71 kB
JavaScript
import { isValidArray } from '../guards/non-primitives.js';
import { roundNumber } from '../number/basics.js';
import { _getNumericProp, _resolveNestedKey } from './helpers.js';
import { splitArrayByProperty } from './transform.js';
export function sumFieldDifference(data, first, second, roundTo = 2) {
if (!isValidArray(data))
return 0;
const total = data?.reduce((acc, item) => {
return acc + (_getNumericProp(item, first) - _getNumericProp(item, second));
}, 0);
return roundNumber(total, roundTo);
}
export function sumByField(data, field, roundTo = 2) {
if (!isValidArray(data))
return 0;
const total = data?.reduce((acc, item) => acc + _getNumericProp(item, field), 0);
return roundNumber(total, roundTo);
}
export function averageByField(data, field, roundTo = 2) {
if (!isValidArray(data))
return 0;
const total = data?.reduce((acc, item) => acc + _getNumericProp(item, field), 0);
return roundNumber(total / data.length, roundTo);
}
export function groupAndSumByField(data, groupBy, sumBy, roundTo = 2) {
if (!isValidArray(data))
return [];
const groups = splitArrayByProperty(data, groupBy);
const result = groups.map((group) => ({
[`${_resolveNestedKey(group[0], groupBy)}`]: sumByField(group, sumBy, roundTo),
}));
return result;
}
export function groupAndAverageByField(data, groupBy, averageBy, roundTo = 2) {
if (!isValidArray(data))
return [];
const groups = splitArrayByProperty(data, groupBy);
const result = groups.map((group) => ({
[`${_resolveNestedKey(group[0], groupBy)}`]: averageByField(group, averageBy, roundTo),
}));
return result;
}