2016-08-22 41 views
1

我正在循环访问一个数组,以修改格式创建另一个对象数组。对象不维护分配的值

for (i = 1; i <= 37; i++) { // create 37 boxes for days of the month and nearby dates 
    room_reservations[i] = {}; 
    var this_date = getDate(); 
    var res_count = 0; 
    for (var res_index = 0; res_index < reservations.length; res_index++) { 
    var this_res = reservations[res_index]; 
    // bad assignment location 
    // res_room = JSON.parse(JSON.stringify(this_res)); 
    if (this_res.checkin <= this_date && this_res.checkout > this_date) { 
     for (var k = 0; k < this_res.rooms.length; k++) { 
     var res_room = {}; 
     res_room = JSON.parse(JSON.stringify(this_res)); 
     var this_room = res_room.rooms[k]; 
     res_room.room_index = k; 
     var traveler_count = this_room.travelers.length; 
     console.log('traveler_count: ', traveler_count); 
     res_room.traveler_count = traveler_count; 
     //traveler_counts[i][res_room.room_name] = traveler_count; 
     console.log('res_room.traveler_count: ', res_room.traveler_count); 
     var room_name = this_room.room_name; 
     console.log('room_name: ', room_name); 
     res_room.room_name = room_name; 
     console.log('res_room: ', res_room); 
     room_reservations[i][res_room.room_name] = res_room; 
     } 
    } 
    } 
} 

本质上,我控制台登录对象属性traveler_count并获得正确的值。但是在记录整个对象时,属性值不正确。这就像它抓住了下一个循环的价值。

enter image description here

我该如何解决这个问题?这不仅仅是日志记录。在room_reservations数组中设置的值是错误的。例如,我将属性名称设置为res_room.room_name,并将值设置为res_room。但属性名称与对象中的值不匹配。

enter image description here

请帮忙。 Thx

+0

看起来'res_room'是一个全局变量(行'7')。你可以尝试使用'var'使它本地化,因为每次迭代都会改变它? – TheHansinator

+0

虽然我同意这是个好主意,但我不明白它是如何导致这个问题的。他没有调用任何可能修改变量的外部函数。 – Barmar

+0

每次通过内部的'for'循环使用相同的'res_room'对象。 – Pointy

回答

1

问题是,您每次通过for (var k)循环时都使用相同的res_room对象。因此,res_room[i]中的所有属性都指的是您修改的相同对象。您需要在分配对象时制作对象的副本。

room_reservations[i][res_room.room_name] = JSON.parse(JSON.stringify(res_room)); 
+0

我修改了代码使用局部变量并将其分配到第三个循环中。它现在有效。谢谢!!!! – Bryan