/
QrDataGenerator.js
66 lines (51 loc) · 1.89 KB
/
QrDataGenerator.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
'use strict';
const _ = require('lodash');
////////////////////////////////////////////////////////////////
//////////////// SAMPLE DATA /////////////////////////////////
////////////////////////////////////////////////////////////////
const __specification = {
"t": "AQPM",
"v": {
"exp": "$first.fa",
"fid": "$second.sa.sb",
"pid": "$third.ta.tb.tc"
},
"a": ["$second.sa.sb", 2, { a: "$second.sa.sc" }]
};
const __sources = {
first: { fa: 'FA!' },
second: {
sa: { sb: "SB!!", sc: "SC==" },
},
third: {
ta: { tb: { tc: 'TC!!!' } }
},
};
////////////////////////////////////////////////////////////////
/////////////////// ALGORITH /////////////////////////////////
////////////////////////////////////////////////////////////////
const transformObjectValues = function (obj, transformFn, sources) {
for (let key in obj) {
if (obj[key] !== null && typeof (obj[key]) == "object") {
transformObjectValues(obj[key], transformFn, sources);
} else {
transformFn.apply(this, [key, obj,sources]);
}
}
};
const valueTransformer = (key, obj, sources) => {
if ((typeof obj[key] === 'string') && obj[key].startsWith("$")) {
const [sourceName, ...path] = obj[key].replace('$', '').split('.');
obj[key] = path.reduce(function (root, prop) { return root[prop]; }, sources[sourceName]);
}
};
const generateQrData = (specification, sources) => {
const data = _.cloneDeep(specification);
transformObjectValues(data, valueTransformer, sources);
return data;
};
////////////////////////////////////////////////////////////////
////////////////////// USAGE /////////////////////////////////
////////////////////////////////////////////////////////////////
const qrData = generateQrData(__specification, __sources);
console.log(JSON.stringify(qrData, null, 2));