Code adds key:property to global varible

Please help me here why does obj.keys. --- item --- get created ?

const obj = global.get("glue." + msg.name + "." + msg.action); // msg.action toggle has run

for (var keys in obj) {
    msg = obj[keys];
    msg.item = keys;
    // obj.item is created in Glue
    delete obj[keys].item  // I now have to delete it
    node.send(msg);
}
return null;

below part of the global variable glue.pushButton

{
    "toggle": {
        "BellButton": {
            "toggle": {
                "Buzzer": {
                    "handler": "buzzer",
                    "item": "Buzzer"
                },
                "BellRinger": {
                    "enabled": false,
                    "handler": "delay",
                    "timeOff": 200,
                    "item": "BellRinger"
                }
            }
        },
        "tester": {
            "pulse": {
                "Bell": {
                    "hendler": "delay",
                    "timeOff": 200
                }
            }
        }
    }
}

routine toggle has bin called hence toggle.BellButton.toggle.buzzer ---> item:Buzzer is added to it

i am wondering why this happens?

EDIT; Thanks to Steve-Mcl

for (var keys in obj) {
    msg = RED.util.cloneMessage(obj[keys]);
    msg.item = keys;
    node.send(msg);
}

This is due to objects being copied by reference.

    msg = obj[keys]; // This line says "point msg to the SAME memory location as obj[keys]
    msg.item = keys; // this line is essentially the same as   obj[keys].item = keys 

try instead...

const obj = global.get("glue." + msg.name + "." + msg.action); // msg.action toggle has run

for (var keys in obj) {
    msg.item = RED.util.cloneMessage(obj[keys]); 
    node.send(msg);
}
1 Like

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