UNPKG

ractive-ez-table

Version:
81 lines (59 loc) 2.02 kB
import utils from './utils.js'; const sortBy = (array, column) => { const compare = column.compare || utils.compare; const prop = utils.prop(column.path); const sorter = column.sortDirection ? (a, b) => compare(prop(a), prop(b)) : (a, b) => compare(prop(b), prop(a)); return array.slice().sort(sorter); }; // not very "elegant"... const rootGroupBy = (array, groups, sortColumn) => { const root = { subGroups: groupBy(array, groups, sortColumn), items: array }; if (sortColumn && !root.groups && root.items) { root.items = sortBy(root.items, sortColumn); } return root; }; const groupBy = (array, groups, sortColumn) => { if (array == null || array.length == 0) return null; if (groups == null || groups.length == 0) return null; const group = groups[0]; const remainingGroups = groups.slice(1); const prop = utils.prop(group.path); const sortedArray = sortBy(array, group); const groupings = []; const addGrouping = (grouping) => { if (remainingGroups.length) { grouping.subGroups = groupBy(grouping.items, remainingGroups, sortColumn); } else if (sortColumn != null) { grouping.items = sortBy(grouping.items, sortColumn); } groupings.push(grouping); } let currentGrouping = { column: group, value: prop(sortedArray[0]), items: [sortedArray[0]], subGroups: null }; for (let i = 1; i < sortedArray.length; i++) { const record = sortedArray[i]; if (prop(record) != currentGrouping.value) { addGrouping(currentGrouping); currentGrouping = { column: group, value: prop(record), items: [], subGroups: null } } currentGrouping.items.push(record); } addGrouping(currentGrouping); return groupings; }; export default rootGroupBy;