rollup.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. function rollup(data, columns) {
  2. var id1 = columns[0];
  3. var name1 = columns[1];
  4. var id2 = columns[2];
  5. var name2 = columns[3];
  6. var value = columns[4];
  7. const nodes = {};
  8. data.results.bindings.forEach((item) => {
  9. if (!nodes[item[id1].value]) {
  10. nodes[item[id1].value] = {value: 0, parent: null, children: [] };
  11. }
  12. if (item[value]) {
  13. nodes[item[id1].value].value = parseInt(item[value].value);
  14. }
  15. if (item[id2]) {
  16. nodes[item[id2].value] = {value: 0, parent: null, children: [] };
  17. nodes[item[id2].value].parent = nodes[item[id1].value];
  18. nodes[item[id1].value].children.push(nodes[item[id2].value]);
  19. }
  20. });
  21. Object.values(nodes).forEach((node) => {
  22. if (node.parent == null) {
  23. visit(node);
  24. }
  25. });
  26. data.head.vars = data.head.vars.filter(item => item !== value);
  27. data.results.bindings.forEach(item => {
  28. if (item[value]) {
  29. delete item[value];
  30. }
  31. item[name1].value += " ("+nodes[item[id1].value].value+")";
  32. if (item[name2]) {
  33. item[name2].value += " ("+nodes[item[id2].value].value+")";
  34. }
  35. });
  36. return data;
  37. }
  38. function visit(node) {
  39. if (node.children.length !== 0) {
  40. node.children.forEach((child) => visit(child));
  41. node.value = node.children.reduce((acc, child) => acc + child.value, 0);
  42. }
  43. }