Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 

66 строки
1.7 KiB

  1. import {InternMap} from "internmap";
  2. import identity from "./identity.js";
  3. export default function group(values, ...keys) {
  4. return nest(values, identity, identity, keys);
  5. }
  6. export function groups(values, ...keys) {
  7. return nest(values, Array.from, identity, keys);
  8. }
  9. function flatten(groups, keys) {
  10. for (let i = 1, n = keys.length; i < n; ++i) {
  11. groups = groups.flatMap(g => g.pop().map(([key, value]) => [...g, key, value]));
  12. }
  13. return groups;
  14. }
  15. export function flatGroup(values, ...keys) {
  16. return flatten(groups(values, ...keys), keys);
  17. }
  18. export function flatRollup(values, reduce, ...keys) {
  19. return flatten(rollups(values, reduce, ...keys), keys);
  20. }
  21. export function rollup(values, reduce, ...keys) {
  22. return nest(values, identity, reduce, keys);
  23. }
  24. export function rollups(values, reduce, ...keys) {
  25. return nest(values, Array.from, reduce, keys);
  26. }
  27. export function index(values, ...keys) {
  28. return nest(values, identity, unique, keys);
  29. }
  30. export function indexes(values, ...keys) {
  31. return nest(values, Array.from, unique, keys);
  32. }
  33. function unique(values) {
  34. if (values.length !== 1) throw new Error("duplicate key");
  35. return values[0];
  36. }
  37. function nest(values, map, reduce, keys) {
  38. return (function regroup(values, i) {
  39. if (i >= keys.length) return reduce(values);
  40. const groups = new InternMap();
  41. const keyof = keys[i++];
  42. let index = -1;
  43. for (const value of values) {
  44. const key = keyof(value, ++index, values);
  45. const group = groups.get(key);
  46. if (group) group.push(value);
  47. else groups.set(key, [value]);
  48. }
  49. for (const [key, values] of groups) {
  50. groups.set(key, regroup(values, i));
  51. }
  52. return map(groups);
  53. })(values, 0);
  54. }