@tidyjs/tidy
Version:
Tidy up your data with JavaScript, inspired by dplyr and the tidyverse
67 lines (64 loc) • 1.87 kB
JavaScript
import { singleOrArray } from './helpers/singleOrArray.js';
function summarize(summarizeSpec, options) {
const _summarize = (items) => {
options = options != null ? options : {};
const summarized = {};
const keys = Object.keys(summarizeSpec);
for (const key of keys) {
summarized[key] = summarizeSpec[key](items);
}
if (options.rest && items.length) {
const objectKeys = Object.keys(items[0]);
for (const objKey of objectKeys) {
if (keys.includes(objKey)) {
continue;
}
summarized[objKey] = options.rest(objKey)(items);
}
}
return [summarized];
};
return _summarize;
}
function _summarizeHelper(items, summaryFn, predicateFn, keys) {
if (!items.length)
return [];
const summarized = {};
let keysArr;
if (keys == null) {
keysArr = Object.keys(items[0]);
} else {
keysArr = [];
for (const keyInput of singleOrArray(keys)) {
if (typeof keyInput === "function") {
keysArr.push(...keyInput(items));
} else {
keysArr.push(keyInput);
}
}
}
for (const key of keysArr) {
if (predicateFn) {
const vector = items.map((d) => d[key]);
if (!predicateFn(vector)) {
continue;
}
}
summarized[key] = summaryFn(key)(items);
}
return [summarized];
}
function summarizeAll(summaryFn) {
const _summarizeAll = (items) => _summarizeHelper(items, summaryFn);
return _summarizeAll;
}
function summarizeIf(predicateFn, summaryFn) {
const _summarizeIf = (items) => _summarizeHelper(items, summaryFn, predicateFn);
return _summarizeIf;
}
function summarizeAt(keys, summaryFn) {
const _summarizeAt = (items) => _summarizeHelper(items, summaryFn, void 0, keys);
return _summarizeAt;
}
export { summarize, summarizeAll, summarizeAt, summarizeIf };
//# sourceMappingURL=summarize.js.map