| 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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85 |
821x
821x
82x
739x
2x
1x
2x
1x
1x
3x
1x
737x
1629x
816x
813x
813x
1x
812x
812x
812x
6x
20x
6x
806x
803x
802x
802x
808x
1x
1x
1x
10x
| "use strict";
function extractAllValues(callback, value, field, scale)
{
let type = typeof value;
if (type === 'undefined' || value === null)
{
return;
}
if (type === 'object')
{
if (Array.isArray(value))
{
for (let part of value)
{
extractAllValues(callback, part, field, scale);
}
return;
}
else
{
for (let part of Object.values(value))
{
extractAllValues(callback, part, field, scale);
}
return
}
}
callback(value, field, scale);
}
function extractFragmentValues(callback, document, fragment, field, scale)
{
if (fragment.length === 0)
{
return extractAllValues(callback, document, field, scale);
}
let top = fragment.splice(0, 1)[0];
if (!document)
{
return;
}
let value = document[top];
let type = typeof value;
if (type === 'object' && Array.isArray(value))
{
for (let part of value)
{
extractFragmentValues(callback, part, fragment.slice(), field, scale);
}
return;
}
return extractFragmentValues(callback, value, fragment, field, scale);
}
/**
* extract values from a document object
*
* @param {object} document target document
* @param {object} fields array of fields or map of fields to score
* @param {function} callback callback function will be called for each value
*/
function extractObjectValues(document, fields, callback)
{
if (Array.isArray(fields))
{
for (let field of fields)
{
extractFragmentValues(callback, document, field.split('.')
.filter(x => x !== ''), field, 1);
}
}
else
{
for (let [field, scale] of Object.entries(fields))
{
extractFragmentValues(callback, document, field.split('.')
.filter(x => x !== ''), field, scale);
}
}
}
module.exports = extractObjectValues;
|