简体   繁体   中英

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???

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)

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];
...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM