UNPKG

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
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; }