@kwiz/common
Version:
KWIZ common utilities and helpers for M365 platform
102 lines • 4.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.GroupByMultiple = exports.groupBy = exports.arraysEqual = void 0;
const objects_1 = require("./objects");
const typecheckers_1 = require("./typecheckers");
/** check that every element in the arrays are the same value */
function arraysEqual(arr1, arr2) {
if ((0, typecheckers_1.isNullOrEmptyArray)(arr1) && (0, typecheckers_1.isNullOrEmptyArray)(arr2))
return true;
return Array.isArray(arr1) && Array.isArray(arr2) && arr1.length === arr2.length && arr1.every((v1, i) => {
var v2 = arr2[i];
if ((0, typecheckers_1.isString)(v1) || (0, typecheckers_1.isNumber)(v1)) {
return v1 === v2;
}
else if (Array.isArray(v1) && Array.isArray(v2)) {
return arraysEqual(v1, v2);
}
else {
return (0, objects_1.objectsEqual)(v1, v2);
}
});
}
exports.arraysEqual = arraysEqual;
/** Takes an array and transforms it into a dictionary. this will assign all items of the same key as an array. */
function groupBy(arr, getKeys, filter) {
let dic = {};
if ((0, typecheckers_1.isNotEmptyArray)(arr))
arr.forEach(i => {
if (!(0, typecheckers_1.isFunction)(filter) || filter(i)) {
let keys = getKeys(i);
keys.forEach(key => {
if ((0, typecheckers_1.isNullOrEmptyString)(key))
key = "";
if (!(0, objects_1.hasOwnProperty)(dic, key))
dic[key] = [i];
else
dic[key].push(i);
});
}
});
return dic;
}
exports.groupBy = groupBy;
var groupByMultipleCacheKey = "$groupByMultipleCache";
/** allows nested multi-level grouping */
function GroupByMultiple(arr, groupDefinitions, options) {
options = options || {};
if (options.clearCache || (0, typecheckers_1.isNullOrUndefined)(arr[groupByMultipleCacheKey])) {
let dic = {};
let groupDefinition = groupDefinitions[0]; //get first
let getKeys = groupDefinition.getGroupsForThisElement;
if ((0, typecheckers_1.isNotEmptyArray)(arr)) {
let groupIndex = 0;
arr.forEach(i => {
if (!(0, typecheckers_1.isFunction)(options.filter) || options.filter(i)) {
let keys = getKeys(i);
keys.forEach(key => {
if ((0, typecheckers_1.isNullOrEmptyString)(key))
key = "";
if (!(0, objects_1.hasOwnProperty)(dic, key)) {
let groupKey = groupIndex.toString(10);
let groupKeyParent = options.parentGroup;
while (groupKeyParent) {
groupKey = groupKeyParent.index + "_" + groupKey;
groupKeyParent = groupKeyParent.parentGroup;
}
dic[key] = {
groupItems: [],
subGroups: {},
depth: options.parentGroup ? options.parentGroup.depth + 1 : 0,
parentGroup: options.parentGroup,
key: groupKey,
index: groupIndex,
title: key,
groupPrefix: groupDefinition.groupPrefix,
fullTitle: `${(0, typecheckers_1.isNullOrEmptyString)(groupDefinition.groupPrefix) ? "" : groupDefinition.groupPrefix}${key}`
};
groupIndex++;
}
let itemWithGroup = i;
itemWithGroup.parentGroup = dic[key];
dic[key].groupItems.push(itemWithGroup);
});
}
});
}
if ((0, typecheckers_1.isNotEmptyArray)(groupDefinitions) && groupDefinitions.length > 1) {
//run for every group and call this again
Object.keys(dic).forEach(groupName => {
let currentGroup = dic[groupName];
currentGroup.subGroups = GroupByMultiple(currentGroup.groupItems, groupDefinitions.slice(1), {
...options,
parentGroup: currentGroup
});
});
}
arr[groupByMultipleCacheKey] = dic;
}
return arr[groupByMultipleCacheKey];
}
exports.GroupByMultiple = GroupByMultiple;
//# sourceMappingURL=collections.js.map