Updating property in object results to updating all properties

Viewed 56

My code :

n_machines = global.get("n_machines");

endtime = [];
running = [];
time_left = [];
types = ["delayed_output_timer","startup_timer"];

timer = {};

for(i = 0 ; i < types.length ; i++){
    
    key = types[i];

    //loop through parameters of timer and set default values
    for(m_num = 0; m_num < n_machines; m_num ++)
    {
        endtime[m_num] = 0;
        running[m_num] = false;
        time_left[m_num] = 0;
    }
    
    timer[key] = { endtime: endtime, running : running, time_left : time_left };
}

timer.delayed_output_timer.running[0] = "TESTING";

test = timer['delayed_output_timer'].running[0];

msg = {payload:[timer,test],topic:"timer"};

return msg;

This returns an object with not only the timer.delayed_output_timer.running[0] changed but also with the object timer.startup_timer.running[0] changed.

What am I doing wrong here? I don't want to change it to an array. I want to understand why and how to change 1 of these objects arrays, not both.

Also note that I'm outside the loop when I'm changing it an I have the same problem when I try to change timer["delayed_output_timer"].running[0] = "TESTING" Here is the output. (its in node red console but that shouldn't matter)

1 Answers

You should probably move the variables endtime, running, and time_left to the scope of the loop. Otherwise if you keep them global, each timer uses that single global object declared at the top.

n_machines = global.get("n_machines");

types = ["delayed_output_timer","startup_timer"];

timer = {};


for(i = 0 ; i < types.length ; i++){
    endtime = [];  /// moved here
    running = [];
    time_left = [];

    key = types[i];
...
Related