node-red-contrib-jsonfilter
Version:
Node-RED node that filters only required fields from objects in a JSON Array
142 lines (77 loc) • 2.63 kB
JavaScript
;
module.exports = function (RED) {
function Filter(config) {
RED.nodes.createNode(this, config);
this.fields = config.fields;
var node = this;
function isEmptyObject(obj) {
return !Object.keys(obj).length;
}
function getKeys(data){
var keyList=Object.keys(data[0]);
return keyList;
}
function lookUpAllKeys(fieldArray,data){
var list=Object.keys(data[0]);
var nonMatchingKeys =[];
var match;
for(var j in fieldArray){
match=false;
for(var i=0;i<list.length;i++){
if (list[i].replace(/\s+/g, '').toUpperCase() === fieldArray[j].replace(/\s+/g, '').toUpperCase()){
match=true;
}
}
if(match === false ){
nonMatchingKeys.push(fieldArray[j]);
}
}
return nonMatchingKeys;
}
this.on('input', function (msg) {
if (node.cache === undefined) {
node.cache = [];
}
var fieldArray = node.fields.split(",");
var data = msg.payload;
if(isEmptyObject(data))
{
node.error('Empty Input received in JSON Filter');
return;
} else{
var jsonStr=JSON.stringify(data);
try {
var parsedJson= JSON.parse(jsonStr);
} catch (e) {
node.error({"JSON Error in JSON Filter ":e});
return;
}
}
var invalidKeys=[];
invalidKeys=lookUpAllKeys(fieldArray,data);
if(invalidKeys.length !== 0){
node.error({"The following Fields in JSON Filter configuration does not have a match in the Data Headers ":invalidKeys});
return;
}
var outputArray = [];
var keyList=getKeys(data);
for(var i = 0; i < data.length; i++) {
var obj = data[i];
var record = {};
for(var j = 0; j < fieldArray.length; j++) {
for(var k=0;k<keyList.length;k++){
if (keyList[k].replace(/\s+/g, '').toUpperCase() === fieldArray[j].replace(/\s+/g, '').toUpperCase()){
record[fieldArray[j].trim()] = obj[keyList[k].trim()];
break;
}
}
}
outputArray.push(record);
}
msg.payload = outputArray;
node.send(msg);
return;
});
}
RED.nodes.registerType("JSONFilter", Filter);
};