Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Javascript updating property in object results to updating all properties?

Im used to php syntaxing and cant seem to understand why im not able to solve my problem with something so simple… so here it goes. (probably im overlooking something really stupid but at this point its like a bull on a red cloth)

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;

When I output this code this returns an object with not only the timer.delayed_output_timer.running[0] changed but alos with the object timer.startup_timer.running[0] changed???

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

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 Im outside the loop when Im 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 shouldnt matter)

>Solution :

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];
...
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading