无法在javascript中复制对象属性

无法在javascript中复制对象属性,javascript,jquery,oop,object,Javascript,Jquery,Oop,Object,我有一个ajax调用,它收集一些实体的父依赖项和子依赖项。在success函数中,我将ajax返回的内容(数据)分配给全局级对象 $.ajax( { type: "POST", url: 'ajax_handler.php', data: {action:'get_dependencies', relation:relation, 'jobs[]':jobs, project:project}, dataType: 'json', async: false

我有一个ajax调用,它收集一些实体的父依赖项和子依赖项。在success函数中,我将ajax返回的内容(数据)分配给全局级对象

$.ajax(
{
    type: "POST",
    url: 'ajax_handler.php',
    data: {action:'get_dependencies', relation:relation, 'jobs[]':jobs, project:project},
    dataType: 'json',
    async: false, //do not change
    success: function(data)
    {
        for(var key in data)
        {
            if( data.hasOwnProperty(key) )
            {
                //Copy data object to document level existingDependency object
                existingDependency[key] = data[key];
            }
        }
    },
    error: function(xhr)
    {
        alert('error2:'+xhr.responseText);
    }
});
我称之为AJAX,它在一个函数中存在两次。一个给父母,一个给孩子。我认为这行
existingDependency[key]=data[key]正在重新分配对象,因此先前的分配将丢失。换句话说,现有的依赖项对象不能同时保存['parent']和['child']属性

为了解决这个问题,我做了以下更改,以便existingDependency同时拥有这两个属性:

success: function(data)
{
    for(var key in data)
    {
        if( data[key].hasOwnProperty(relation) )
        {
            //Copy data object to document level existingDependency object
            existingDependency[key][relation] = data[key][relation];
        }
    }
}
但这根本不起作用。existingDependency对象为空。下面的警报为空

var keys = '';
for(key in existingDependency)
{
    keys += key+'\n';
}

alert(keys);
你知道为什么这个赋值
存在依赖关系[key][relation]=data[key][relation]
不起作用吗?如果数据[键][关系]有任何不同,它将保存一个数组。

使用:

至于为什么eD[key]=data[key]可以工作,而eD[key][relation]=data[key][relation]不能够运行代码并进行调试,这并不难解释。但如果eD[key]还不存在,那么它就无法向其添加“关系”。一个可能的解决办法是:

if (!eD.hasOwnProperty(key)){
    eD[key] = {};
}
eD[key][relation] = data[key][relation];
使用:

至于为什么eD[key]=data[key]可以工作,而eD[key][relation]=data[key][relation]不能够运行代码并进行调试,这并不难解释。但如果eD[key]还不存在,那么它就无法向其添加“关系”。一个可能的解决办法是:

if (!eD.hasOwnProperty(key)){
    eD[key] = {};
}
eD[key][relation] = data[key][relation];

对于初学者来说,
if(data[key].hasOwnProperty(relation)){
是否为真?您何时检查对象?您是否意识到Ajax是异步的(除非您禁用它,您不应该禁用它,但您确实禁用了它)。如果您没有为第二个Ajax调用设置
async:false
,并在成功回调之外的任何位置检查对象,那么这很可能就是问题所在。了解如何使用回调,尤其是在使用jQuery、延迟对象时:。警报(数据[键][关系])可以很好地显示依赖项。因此,是的,它返回true。数据对象具有属性,但由于某些原因无法将其分配给现有的依赖项[key][relation]。我假设是,但在您查看它的时候不是……您能在
data
中发布返回的JSON吗?首先,它是
if(data[key].hasOwnProperty(relation)){
真的吗?你什么时候检查对象?你知道Ajax是异步的吗(除非你禁用了它,你不应该禁用它,但你确实禁用了它)。如果您没有为第二个Ajax调用设置
async:false
,并在成功回调之外的任何位置检查对象,那么这很可能就是问题所在。了解如何使用回调,尤其是在使用jQuery、延迟对象时:。警报(数据[键][关系])很好地显示依赖项。因此,是的,它返回true。数据对象具有属性,但由于某些原因,无法将其分配给现有依赖项[key][relation]。我想是的,但不是在您查看它的时候…您能将返回的JSON发布到
数据中吗?
?不幸的是,这没有像您所描述的那样合并。当我提醒
existingDependency[key]['parent']
existingDependency[key]['child']
每次对于子项和父项,它都会为父项通知子项编号OK和undefined,这是预期的,但下一次通知父项编号OK,但为子项通知undefined。因此子项会被覆盖。查看扩展文档时,我需要一份深度副本才能工作。
$.extend(true,existingDependency,data)
。如果您能更新您的答案,我将接受。谢谢您的回答。虽然这解决了我的问题,但我仍然想知道为什么
eD[key]=data[key]
eD[key][relation]=data[key][relation]时有效
没有。更新了我的答案,并给出了可能的解释。不幸的是,这并不像您描述的那样合并。当我提醒
existingDependency[key]['parent']
existingDependency[key]['child']
每次对于子项和父项,它都会为父项通知子项编号OK和undefined,这是预期的,但下一次通知父项编号OK,但为子项通知undefined。因此子项会被覆盖。查看扩展文档时,我需要一份深度副本才能工作。
$.extend(true,existingDependency,data)
。如果你能更新你的答案,我会接受。谢谢你的回答。虽然这解决了我的问题,但我仍然想知道为什么
eD[key]=data[key]
有效,而
eD[key][relation]=data[key][relation]
无效。更新了我的答案,并给出了可能的解释。