JS make array from object values with "key" filtering

Hi all,

I'm looking to make a array of values from object.
I would like to filter the object keys, to make array only with the desired objects.

I have tested with this code, but something is wrong:

var GlObject=global.get("Objecte")||0;
var uploaditems=[];

for (const property in GlObject) {
    if (Object.keys(GlObject).includes("VOLTATGEL1")){
        //uploaditems.push(GlObject.value); 
        uploaditems.push(property); }
}

global.set("uploaditems",uploaditems);
return {payload:uploaditems};

This is how global object is:
Global Object

Thank you all!

uploaditems.push(property);

should be

uploaditems.push({[property]: GlObject[property]});

if you wish to return the object

2 Likes

Hi .. What exactly you want to be returned ? The matching key and value pair ?
For example VOLTATGEL1: 400 ?

GlObject = {
     VOLTATGEL1: 400, 
     INTENSITATL1: 2, 
     POTENCIAL1: 12, 
     POTREACL1: 1,
     FACTORPOTL1: 0.95,
     VOLTATGEL2: 405, 
     INTENSITATL2: 22, 
     POTENCIAL2: 12, 
     POTREACL2: 3, 
     FACTORPOTL2: 0.96, 
     VOLTATGEL3: 399, 
     INTENSITATL3: 17, 
     POTENCIAL3: 6, 
     POTREACL3: 2, 
     FACTORPOTL3: 0.89, 
     POTENCIAACTIVAIII: 25, 
     POTENCIAINDUCTIVAIII: 20, 
     POTENCIACAPACITIVAIII: 5, 
     COSPHI: 0.85 
}

let result = []

Object.entries(GlObject).forEach( ([key,value]) => {
    if ( key.match(/VOLTATGEL1/) )
    {
        result.push({[key]: value }) 
    }
})
    
msg.payload = result
   
return msg;

Test flow :

[{"id":"de91c851.6e103","type":"inject","z":"aa111c28.0194a","name":"trigger","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":280,"y":200,"wires":[["48ada723.4577a"]]},{"id":"48ada723.4577a","type":"function","z":"aa111c28.0194a","name":"","func":"GlObject = {\n     VOLTATGEL1: 400, \n     INTENSITATL1: 2, \n     POTENCIAL1: 12, \n     POTREACL1: 1,\n     FACTORPOTL1: 0.95,\n     VOLTATGEL2: 405, \n     INTENSITATL2: 22, \n     POTENCIAL2: 12, \n     POTREACL2: 3, \n     FACTORPOTL2: 0.96, \n     VOLTATGEL3: 399, \n     INTENSITATL3: 17, \n     POTENCIAL3: 6, \n     POTREACL3: 2, \n     FACTORPOTL3: 0.89, \n     POTENCIAACTIVAIII: 25, \n     POTENCIAINDUCTIVAIII: 20, \n     POTENCIACAPACITIVAIII: 5, \n     COSPHI: 0.85 \n}\n\nlet result = []\n\nObject.entries(GlObject).forEach( ([key,value]) => {\n    if ( key.match(/VOLTATGEL1/) )\n    {\n        result.push({[key]: value }) \n    }\n})\n    \nmsg.payload = result\n   \nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":460,"y":200,"wires":[["b3e46e18.7e1578"]]},{"id":"b3e46e18.7e1578","type":"debug","z":"aa111c28.0194a","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":650,"y":200,"wires":[]}]
1 Like

Hi @UnborN thanks for your help.
I answer your questions.

The main goal is to filter object keys that contain for example:
VOLT or ENSIT ... I don't know if it is possible.

Sample:
I want to filter in object keys the word containing (ENSIT). How should be the output?

msg2.payload= [2,22,17]
msg2.topic=[INTENSITATL1,INTENSITATL2,INTENSITATL3]

Thanks

You want the Topic also to be an array ? .. usually in Node-red the msg.topic is reserved to be used as a small description of what the msg is about. It would be better if you returned an array of objects but if you need it this way.

GlObject = {
    VOLTATGEL1: 400, 
    INTENSITATL1: 2, 
    POTENCIAL1: 12, 
    POTREACL1: 1,
    FACTORPOTL1: 0.95,
    VOLTATGEL2: 405, 
    INTENSITATL2: 22, 
    POTENCIAL2: 12, 
    POTREACL2: 3, 
    FACTORPOTL2: 0.96, 
    VOLTATGEL3: 399, 
    INTENSITATL3: 17, 
    POTENCIAL3: 6, 
    POTREACL3: 2, 
    FACTORPOTL3: 0.89, 
    POTENCIAACTIVAIII: 25, 
    POTENCIAINDUCTIVAIII: 20, 
    POTENCIACAPACITIVAIII: 5, 
    COSPHI: 0.85 
}

let payload = []
let topic = []

Object.entries(GlObject).forEach( ([key,value]) => {
   if ( key.match(/ENSIT/) )   // regex to match
   {
       payload.push(value) 
       topic.push(key) 
   }
})
   
msg.payload = payload
msg.topic = topic

return msg;
1 Like

Or

let GlObject = {
     VOLTATGEL1: 400, 
     INTENSITATL1: 2, 
     POTENCIAL1: 12, 
     POTREACL1: 1,
     FACTORPOTL1: 0.95,
     VOLTATGEL2: 405, 
     INTENSITATL2: 22, 
     POTENCIAL2: 12, 
     POTREACL2: 3, 
     FACTORPOTL2: 0.96, 
     VOLTATGEL3: 399, 
     INTENSITATL3: 17, 
     POTENCIAL3: 6, 
     POTREACL3: 2, 
     FACTORPOTL3: 0.89, 
     POTENCIAACTIVAIII: 25, 
     POTENCIAINDUCTIVAIII: 20, 
     POTENCIACAPACITIVAIII: 5, 
     COSPHI: 0.85 
},
key = "ENSIT";
msg.payload = [];
msg.topic =[];
for(const K in GlObject){ // loop through keys
   if(K.includes(key)){
       msg.payload.push(GlObject[K]);
       msg.topic.push(K);
   }
}
return msg;
1 Like

Thank you all!! SOLVED

1 Like

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.