UNPKG

@kwiz/common

Version:

KWIZ common utilities and helpers for M365 platform

102 lines 4.7 kB
"use strict"; 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