修改第 2 个 window 中的 JSON 会修改第一个 window 中的原始 JSON

Modifying JSON in 2nd window modifies the original JSON in 1st window

我有两个windows。在第一个 window 中,我有以下 JSON。我使用 Alloy.createController("set_schedule", {"data" : data}) 将此 JSON 从第一个 window 传递到第二个 window。在 2nd window 中,我将数据推送到插槽,它正在修改 1st window 的原始 JOSN。我不想要这个。它不应修改原始数据。我尝试将 args.data 存储到局部变量然后进行操作,但没有任何效果。

schedule.js

var data = [{
    "day" : "monday",
    "slots" : [],
    "duration" : 0
}, {
    "day" : "tuesday",
    "slots" : [],
    "duration" : 0
}, {
    "day" : "wednesday",
    "slots" : [],
    "duration" : 0
}, {
    "day" : "thursday",
    "slots" : [],
    "duration" : 0
}, {
    "day" : "friday",
    "slots" : [],
    "duration" : 0
}, {
    "day" : "saturday",
    "slots" : [],
    "duration" : 0
}, {
    "day" : "sunday",
    "slots" : [],
    "duration" : 0
}] 

var win = Alloy.createController("set_schedule", {
    "data" : data
}).getView("setSchedule");
win.open();

set_schedule.js

var scheduleData = args.data; //copy to local variable
scheduleData[0].slots.push({"start": "09:00:00",
    "finish": "17:00:00"});

现在我关闭 set_schedule window 并返回时间表 window 它正在显示

var data = [{
    "day" : "monday",
    "slots" : [{"start": "09:00:00",
    "finish": "17:00:00"}],
    "duration" : 0
}, {
    "day" : "tuesday",
    "slots" : [],
    "duration" : 0
}, {
    "day" : "wednesday",
    "slots" : [],
    "duration" : 0
}, {
    "day" : "thursday",
    "slots" : [],
    "duration" : 0
}, {
    "day" : "friday",
    "slots" : [],
    "duration" : 0
}, {
    "day" : "saturday",
    "slots" : [],
    "duration" : 0
}, {
    "day" : "sunday",
    "slots" : [],
    "duration" : 0
}] 

可能的解决方案是在将 JSON 传递给第二个 window 时对其进行字符串化,然后在另一侧对其进行解析。这将确保它不是您正在操作的同一个对象。

您的代码似乎正在创建一种情况,其中存在有效的 ByRef 参数调用(发送对象的引用而不是 JSON 对象本身)。

您传递的对象是 byref,因为它是一个对象。你应该做的是将该对象克隆到一个新的 json 对象:

var newJsonObj = JSON.parse(JSON.stringify(data));

注意 - 它可能不是最适合您的解决方案(我只是不知道您的业务逻辑是什么)。