Skip to content

Commit 6bf5f19

Browse files
committed
Working on operations for Missing (data missing, by key) and Merge (concatenate arrays)
1 parent 8c0037c commit 6bf5f19

File tree

2 files changed

+50
-3
lines changed

2 files changed

+50
-3
lines changed

logic.js

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,12 @@ var jsonLogic = {},
7777
"-" : function(a,b){ if(b === undefined){return -a;}else{return a - b;} },
7878
"/" : function(a,b){ if(b === undefined){return a;}else{return a / b;} },
7979
"min" : function(){ return Math.min.apply(this,arguments); },
80-
"max" : function(){ return Math.max.apply(this,arguments); }
80+
"max" : function(){ return Math.max.apply(this,arguments); },
81+
"merge" : function(){
82+
return Array.prototype.reduce.call(arguments, function(a,b){
83+
return a.concat(b);
84+
}, []);
85+
}
8186
};
8287

8388
jsonLogic.is_logic = function(logic){
@@ -144,7 +149,7 @@ jsonLogic.apply = function(logic, data){
144149
// Everyone else gets immediate depth-first recursion
145150
values = values.map(function(val){ return jsonLogic.apply(val, data); });
146151

147-
// 'var' needs access to data, only available in this scope
152+
// 'var' and 'missing' need access to data, only available in this scope
148153
if(op === "var"){
149154
var not_found = values[1] || null,
150155
sub_props = String(values[0]).split(".");
@@ -154,6 +159,16 @@ jsonLogic.apply = function(logic, data){
154159
if(data === undefined){ return not_found; }
155160
}
156161
return data;
162+
163+
}else if(op === "missing"){
164+
var missing = [];
165+
values.map(function(data_key){
166+
if(jsonLogic.apply({'var':data_key}, data) === null){
167+
missing.push(data_key);
168+
}
169+
});
170+
171+
return missing;
157172
}
158173

159174
if(undefined === operations[op]){

tests/tests.json

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,38 @@
6060
[{"if":[true, "apple", false, "banana", false, "carrot", "date"]}, null, "apple"],
6161
[{"if":[true, "apple", false, "banana", true, "carrot", "date"]}, null, "apple"],
6262
[{"if":[true, "apple", true, "banana", false, "carrot", "date"]}, null, "apple"],
63-
[{"if":[true, "apple", true, "banana", true, "carrot", "date"]}, null, "apple"]
63+
[{"if":[true, "apple", true, "banana", true, "carrot", "date"]}, null, "apple"],
6464

65+
"Missing",
66+
67+
[{"missing":[]}, null, []],
68+
[{"missing":["a"]}, null, ["a"]],
69+
[{"missing":"a"}, null, ["a"]],
70+
[{"missing":"a"}, {"a":"apple"}, []],
71+
[{"missing":["a"]}, {"a":"apple"}, []],
72+
[{"missing":["a","b"]}, {"a":"apple"}, ["b"]],
73+
[{"missing":["a","b"]}, {"b":"banana"}, ["a"]],
74+
[{"missing":["a","b"]}, {"a":"apple", "b":"banana"}, []],
75+
[{"missing":["a","b"]}, {}, ["a","b"]],
76+
[{"missing":["a","b"]}, null, ["a","b"]],
77+
78+
[{"missing":["a.b"]}, null, ["a.b"]],
79+
[{"missing":["a.b"]}, {"a":"apple"}, ["a.b"]],
80+
[{"missing":["a.b"]}, {"a":{"c":"apple cake"}}, ["a.b"]],
81+
[{"missing":["a.b"]}, {"a":{"b":"apple brownie"}}, []],
82+
[{"missing":["a.b", "a.c"]}, {"a":{"b":"apple brownie"}}, ["a.c"]],
83+
84+
"Missing and If are friends",
85+
[{"if":[ {"missing":"a"}, "missed it", "found it" ]}, {"a":"apple"}, "found it"],
86+
[{"if":[ {"missing":"a"}, "missed it", "found it" ]}, {"b":"banana"}, "missed it"],
87+
88+
"Merge arrays",
89+
[{"merge":[]}, null, []],
90+
[{"merge":[["a"]]}, null, ["a"]],
91+
[{"merge":[["a"], ["b"]]}, null, ["a","b"]],
92+
[{"merge":[["a"], ["b"], ["c"]]}, null, ["a","b","c"]],
93+
[{"merge":[["a", "b"], ["c"]]}, null, ["a","b","c"]],
94+
[{"merge":[["a"], ["b", "c"]]}, null, ["a","b","c"]],
95+
96+
"END"
6597
]

0 commit comments

Comments
 (0)