Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

185 linhas
6.3 KiB

  1. const { clone } = require('../core/util');
  2. module.exports = {
  3. addColumns: function(options) {
  4. let collection = this.parseRequired(options.collection, 'object'/*array[object]*/, 'collections.addColumns: collection is required.');
  5. let add = this.parseRequired(options.add, 'object', 'collections.addColumns: add is required.');
  6. let overwrite = this.parseOptional(options.overwrite, 'boolean', false);
  7. let output = [];
  8. for (let row of collection) {
  9. let newRow = clone(row);
  10. for (let column in add) {
  11. if (overwrite || newRow[column] == null) {
  12. newRow[column] = add[column];
  13. }
  14. }
  15. output.push(newRow);
  16. }
  17. return output;
  18. },
  19. filterColumns: function(options) {
  20. let collection = this.parseRequired(options.collection, 'object'/*array[object]*/, 'collections.filterColumns: collection is required.');
  21. let columns = this.parseRequired(options.columns, 'object'/*array[string]*/, 'collections.filterColumns: columns is required.');
  22. let keep = this.parseOptional(options.keep, 'boolean', false);
  23. let output = [];
  24. for (let row of collection) {
  25. let newRow = {};
  26. for (let column in row) {
  27. if (columns.includes(column)) {
  28. if (keep) {
  29. newRow[column] = clone(row[column]);
  30. }
  31. } else if (!keep) {
  32. newRow[column] = clone(row[column]);
  33. }
  34. }
  35. output.push(newRow);
  36. }
  37. return output;
  38. },
  39. renameColumns: function(options) {
  40. let collection = this.parseRequired(options.collection, 'object'/*array[object]*/, 'collections.renamecolumns: collection is required.');
  41. let rename = this.parseRequired(options.rename, 'object', 'collections.renamecolumns: rename is required.');
  42. let output = [];
  43. for (let row of collection) {
  44. let newRow = {};
  45. for (let column in row) {
  46. newRow[rename[column] || column] = clone(row[column]);
  47. }
  48. output.push(newRow);
  49. }
  50. return output;
  51. },
  52. fillDown: function(options) {
  53. let collection = this.parseRequired(options.collection, 'object'/*array[object]*/, 'collections.fillDown: collection is required.');
  54. let columns = this.parseRequired(options.columns, 'object'/*array[string]*/, 'collections.fillDown: columns is required.');
  55. let output = [];
  56. let values = {};
  57. for (let column of columns) {
  58. values[column] = null;
  59. }
  60. for (let row of collection) {
  61. let newRow = clone(row);
  62. for (let column in values) {
  63. if (newRow[column] == null) {
  64. newRow[column] = values[column];
  65. } else {
  66. values[column] = newRow[column];
  67. }
  68. }
  69. output.push(newRow);
  70. }
  71. return output;
  72. },
  73. addRows: function(options) {
  74. let collection = this.parseRequired(options.collection, 'object'/*array[object]*/, 'collections.addRows: collection is required.');
  75. let rows = this.parseRequired(options.rows, 'object'/*array[object]*/, 'collections.addRows: rows is required.');
  76. return clone(collection).concat(clone(rows));
  77. },
  78. addRownumbers: function(options) {
  79. let collection = this.parseRequired(options.collection, 'object'/*array[object]*/, 'collections.addRownumbers: collection is required.');
  80. let column = this.parseOptional(options.column, 'string', 'nr');
  81. let startAt = this.parseOptional(options.startAt, 'number', 1);
  82. let desc = this.parseOptional(options.desc, 'boolean', false);
  83. let output = [];
  84. let nr = desc ? collection.length + startAt - 1 : startAt;
  85. for (let row of collection) {
  86. let newRow = clone(row);
  87. newRow[column] = desc ? nr-- : nr++;
  88. output.push(newRow);
  89. }
  90. return output;
  91. },
  92. join: function(options) {
  93. let collection1 = this.parseRequired(options.collection1, 'object'/*array[object]*/, 'collections.join: collection1 is required.');
  94. let collection2 = this.parseRequired(options.collection2, 'object'/*array[object]*/, 'collections.join: collection2 is required.');
  95. let matches = this.parseRequired(options.matches, 'object', 'collections.join: matches is required.');
  96. let matchAll = this.parseOptional(options.matchAll, 'boolean', false);
  97. let output = [];
  98. for (let row1 of collection1) {
  99. let newRow = clone(row1);
  100. for (let row2 of collection2) {
  101. let join = false;
  102. for (let match in matches) {
  103. if (row1[match] == row2[matches[match]]) {
  104. join = true;
  105. if (!matchAll) break;
  106. } else if (matchAll) {
  107. join = false;
  108. break;
  109. }
  110. }
  111. if (join) {
  112. for (let column in row2) {
  113. newRow[column] = clone(row2[column]);
  114. }
  115. break;
  116. }
  117. }
  118. output.push(newRow);
  119. }
  120. return output;
  121. },
  122. normalize: function(options) {
  123. let collection = this.parseRequired(options.collection, 'object'/*array[object]*/, 'collections.normalize: collection is required.');
  124. let columns = [];
  125. let output = [];
  126. for (let row of collection) {
  127. for (let column in row) {
  128. if (!columns.includes(column)) {
  129. columns.push(column);
  130. }
  131. }
  132. }
  133. for (let row of collection) {
  134. let newRow = {};
  135. for (let column of columns) {
  136. newRow[column] = row[column] == null ? null : clone(row[column]);
  137. }
  138. output.push(newRow);
  139. }
  140. return output;
  141. },
  142. };