UNPKG

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
"use strict"; 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); };