|
- const { clone } = require('../core/util');
-
- module.exports = {
-
- addColumns: function(options) {
- let collection = this.parseRequired(options.collection, 'object'/*array[object]*/, 'collections.addColumns: collection is required.');
- let add = this.parseRequired(options.add, 'object', 'collections.addColumns: add is required.');
- let overwrite = this.parseOptional(options.overwrite, 'boolean', false);
- let output = [];
-
- for (let row of collection) {
- let newRow = clone(row);
-
- for (let column in add) {
- if (overwrite || newRow[column] == null) {
- newRow[column] = add[column];
- }
- }
-
- output.push(newRow);
- }
-
- return output;
- },
-
- filterColumns: function(options) {
- let collection = this.parseRequired(options.collection, 'object'/*array[object]*/, 'collections.filterColumns: collection is required.');
- let columns = this.parseRequired(options.columns, 'object'/*array[string]*/, 'collections.filterColumns: columns is required.');
- let keep = this.parseOptional(options.keep, 'boolean', false);
- let output = [];
-
- for (let row of collection) {
- let newRow = {};
-
- for (let column in row) {
- if (columns.includes(column)) {
- if (keep) {
- newRow[column] = clone(row[column]);
- }
- } else if (!keep) {
- newRow[column] = clone(row[column]);
- }
- }
-
- output.push(newRow);
- }
-
- return output;
- },
-
- renameColumns: function(options) {
- let collection = this.parseRequired(options.collection, 'object'/*array[object]*/, 'collections.renamecolumns: collection is required.');
- let rename = this.parseRequired(options.rename, 'object', 'collections.renamecolumns: rename is required.');
- let output = [];
-
- for (let row of collection) {
- let newRow = {};
-
- for (let column in row) {
- newRow[rename[column] || column] = clone(row[column]);
- }
-
- output.push(newRow);
- }
-
- return output;
- },
-
- fillDown: function(options) {
- let collection = this.parseRequired(options.collection, 'object'/*array[object]*/, 'collections.fillDown: collection is required.');
- let columns = this.parseRequired(options.columns, 'object'/*array[string]*/, 'collections.fillDown: columns is required.');
- let output = [];
- let values = {};
-
- for (let column of columns) {
- values[column] = null;
- }
-
- for (let row of collection) {
- let newRow = clone(row);
-
- for (let column in values) {
- if (newRow[column] == null) {
- newRow[column] = values[column];
- } else {
- values[column] = newRow[column];
- }
- }
-
- output.push(newRow);
- }
-
- return output;
- },
-
- addRows: function(options) {
- let collection = this.parseRequired(options.collection, 'object'/*array[object]*/, 'collections.addRows: collection is required.');
- let rows = this.parseRequired(options.rows, 'object'/*array[object]*/, 'collections.addRows: rows is required.');
-
- return clone(collection).concat(clone(rows));
- },
-
- addRownumbers: function(options) {
- let collection = this.parseRequired(options.collection, 'object'/*array[object]*/, 'collections.addRownumbers: collection is required.');
- let column = this.parseOptional(options.column, 'string', 'nr');
- let startAt = this.parseOptional(options.startAt, 'number', 1);
- let desc = this.parseOptional(options.desc, 'boolean', false);
- let output = [];
- let nr = desc ? collection.length + startAt - 1 : startAt;
-
- for (let row of collection) {
- let newRow = clone(row);
-
- newRow[column] = desc ? nr-- : nr++;
-
- output.push(newRow);
- }
-
- return output;
- },
-
- join: function(options) {
- let collection1 = this.parseRequired(options.collection1, 'object'/*array[object]*/, 'collections.join: collection1 is required.');
- let collection2 = this.parseRequired(options.collection2, 'object'/*array[object]*/, 'collections.join: collection2 is required.');
- let matches = this.parseRequired(options.matches, 'object', 'collections.join: matches is required.');
- let matchAll = this.parseOptional(options.matchAll, 'boolean', false);
- let output = [];
-
- for (let row1 of collection1) {
- let newRow = clone(row1);
-
- for (let row2 of collection2) {
- let join = false;
-
- for (let match in matches) {
- if (row1[match] == row2[matches[match]]) {
- join = true;
- if (!matchAll) break;
- } else if (matchAll) {
- join = false;
- break;
- }
- }
-
- if (join) {
- for (let column in row2) {
- newRow[column] = clone(row2[column]);
- }
- break;
- }
- }
-
- output.push(newRow);
- }
-
- return output;
- },
-
- normalize: function(options) {
- let collection = this.parseRequired(options.collection, 'object'/*array[object]*/, 'collections.normalize: collection is required.');
- let columns = [];
- let output = [];
-
- for (let row of collection) {
- for (let column in row) {
- if (!columns.includes(column)) {
- columns.push(column);
- }
- }
- }
-
- for (let row of collection) {
- let newRow = {};
-
- for (let column of columns) {
- newRow[column] = row[column] == null ? null : clone(row[column]);
- }
-
- output.push(newRow);
- }
-
- return output;
- },
-
- };
|