UNPKG

3.77 kBJavaScriptView Raw
1import { selectTabularToSamples, tabularToSamples, voidTabular } from '@analys/tabular';
2import { matchSlice } from '@analys/table-init';
3import { unwind } from '@vect/entries-unwind';
4import { mapper, iterate } from '@vect/vector-mapper';
5import { select } from '@vect/vector-select';
6import { Table } from '@analys/table';
7import { CrosTab } from '@analys/crostab';
8import { selectValues, SelectValues } from '@vect/object-select';
9import { first } from '@vect/vector-index';
10
11/**
12 *
13 * @param {TableObject} table
14 * @param {(str|[str,str])[]} [fields]
15 * @returns {Object[]} samples
16 */
17
18const tableToSamples = (table, fields) => fields !== null && fields !== void 0 && fields.length ? selectTabularToSamples.call(matchSlice(table), fields) : tabularToSamples.call(matchSlice(table));
19
20/**
21 *
22 * @param {Object} o
23 * @returns {Table}
24 */
25
26const toTable = o => new Table(o.head || o.banner, o.rows || o.matrix, o.title, o.types);
27
28/**
29 *
30 * @param {Object[]} samples
31 * @param {(str|[str,str])[]} [fields]
32 * @returns {Table}
33 */
34
35const samplesToTable = (samples, fields) => {
36 var _samplesToTabular;
37
38 return _samplesToTabular = samplesToTabular(samples, fields), toTable(_samplesToTabular);
39};
40/**
41 *
42 * @param {Object[]} samples
43 * @param {(str|[str,str])[]} [fields]
44 * @returns {TableObject}
45 */
46
47function samplesToTabular(samples, fields) {
48 var _selectFieldMapping$c;
49
50 let height, width;
51 if (!(height = samples === null || samples === void 0 ? void 0 : samples.length)) return voidTabular();
52 if (!(fields !== null && fields !== void 0 && fields.length)) return convertSamplesToTabular(samples);
53 const [keys, head] = (_selectFieldMapping$c = selectFieldMapping.call(samples[0], fields), unwind(_selectFieldMapping$c));
54 if (!(width = keys === null || keys === void 0 ? void 0 : keys.length)) return voidTabular();
55 const rows = mapper(samples, sample => select(sample, keys, width), height);
56 return {
57 head,
58 rows
59 };
60}
61const selectFieldMapping = function (fields) {
62 const sample = this,
63 mapping = [],
64 fieldMapper = fieldMapping.bind(sample);
65 let kvp;
66 iterate(fields, field => {
67 if (kvp = fieldMapper(field)) mapping.push(kvp);
68 });
69 return mapping;
70};
71/**
72 *
73 * @param {str|[*,*]} [field]
74 * @returns {[str,number]}
75 */
76
77const fieldMapping = function (field) {
78 const sample = this;
79
80 if (Array.isArray(field)) {
81 const [current, projected] = field;
82 return current in sample ? [current, projected] : null;
83 }
84
85 return field in sample ? [field, field] : null;
86};
87function convertSamplesToTabular(samples) {
88 var _Object$entries;
89
90 const height = samples === null || samples === void 0 ? void 0 : samples.length;
91 if (!height) return voidTabular();
92 const rows = Array(height);
93 let head;
94 [head, rows[0]] = (_Object$entries = Object.entries(samples[0]), unwind(_Object$entries));
95
96 for (let i = 1, w = (_head = head) === null || _head === void 0 ? void 0 : _head.length; i < height; i++) {
97 var _head;
98
99 rows[i] = select(samples[i], head, w);
100 }
101
102 return {
103 head,
104 rows
105 };
106}
107
108/**
109 *
110 * @param sampleCollection
111 * @param {Object} config
112 * @param {[]} config.side
113 * @param {[]} config.head
114 * @returns {CrosTab}
115 */
116
117function samplesToCrostab(sampleCollection, config = {}) {
118 var _samples;
119
120 const samples = config.side ? selectValues(sampleCollection, config.side) : Object.values(sampleCollection);
121 const side = config.side ?? Object.keys(sampleCollection);
122 const head = config.head ?? Object.keys((_samples = samples, first(_samples)));
123 const rows = samples.map(config.head ? SelectValues(config.head) : Object.values);
124 return CrosTab.from({
125 side,
126 head,
127 rows
128 });
129}
130
131export { samplesToCrostab, samplesToTable, samplesToTabular, tableToSamples, toTable };