-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
39 lines (37 loc) · 896 Bytes
/
index.js
File metadata and controls
39 lines (37 loc) · 896 Bytes
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
module.exports = getInMap;
function getInMap(mapObject, keyExpression) {
var keys = Object.keys(mapObject).sort();
if (keys.length === 0) {
return {$literal: null};
}
var tree = buildTree(0, keys.length - 1);
return tree;
function buildTree(start, end) {
var elements = end - start + 1;
if (elements === 1) {
var key = keys[start];
return {$cond: [{$eq: [keyExpression, key]}, {$literal: mapObject[key]}, null]};
}
if (elements === 2) {
var startKey = keys[start];
return {
$cond: [
{ $eq: [keyExpression, startKey] },
{ $literal: mapObject[startKey] },
buildTree(start + 1, end)
]
};
}
if (elements > 2) {
var middle = Math.ceil((start + end) / 2);
var middleKey = keys[middle];
return {
$cond: [
{ $lt: [keyExpression, middleKey] },
buildTree(start, middle - 1),
buildTree(middle, end)
]
};
}
}
}