无法在javascript中复制对象属性

时间:2012-12-28 16:50:29

标签: javascript jquery oop object

我有一个ajax调用,它收集了某些实体的父和子依赖项。在成功函数内部,我将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];正在重新分配对象,因此先前的分配丢失了。换句话说,existingDependency对象不能同时包含['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);

为什么此作业existingDependency[key][relation] = data[key][relation]不起作用的任何想法? data [key] [relation]如果有任何不同,则会保存一个数组。

1 个答案:

答案 0 :(得分:1)

使用extend

$.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) {
        $.extend(true, existingDependency, data);//this will copy/merge "data" into "existingDependency". properties from "data" that also exist in "existingDependency" will be overwritten with those from "data".
    },
    error: function(xhr) {
        alert('error2:'+xhr.responseText);
    }
});

至于为什么eD [key] = data [key]可以工作,而eD [key] [relation] = data [key] [relation]如果没有能够运行你的代码并进行调试就不难说了。但是,如果eD [key]尚未存在,那么它将无法为其添加“关系”。可能的解决办法是:

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