用另一个对象的属性替换一个对象的属性?

时间:2015-01-25 06:31:14

标签: javascript clone

首先,我并不是说将一个对象深深地克隆到另一个对象。

我有一个对象:

var data1 = {
               p1: values1,
               p2: values2,
               .....
            };

value1和value2可以是任何数据类型,如对象或数组。

我有另一个对象:

var data2 = {
               p3: values3,
               p4: values4,
               .....
            };

value3和value4可以是任何数据类型,如对象或数组。

现在我想将所有data2的属性克隆到data1。

我想要这个的原因是data1被引用,在data1的属性被更改后我不想破坏引用。

如果我做的话

 data1 = clone(data2)

我将打破参考。

更新:  打破引用意味着什么:

var data1 = {
             p1: value1
          }; 
var data2 = {
              p2: vale2
          };
var ref = data1;

如果我这样做:

data1 = clone(data2);  

现在ref仍然指向旧的data1,它的值仍然是:

{
   p1: value1
}

但我希望ref为data2

3 个答案:

答案 0 :(得分:4)

您可以使用此功能:

function replaceProperties(dest, src)  {
    for (var i in dest) 
        delete dest[i];
    for (var i in src) 
        dest[i] = src[i];
}

代码很明显,看起来就像你想要的那样。它没有打破参考"就像你说的那样。

虽然在属性不可枚举时或原型中可能无法执行您想要的操作...

如果您不必支持IE10,之前使用__proto__setPrototypeof,则可以在dest属性更改时进行src更新:

function replaceProperties(dest, src)  {
    for (var i in dest) 
        delete dest[i];
    Object.setPrototypeOf(dest, src);
}

答案 1 :(得分:1)

尝试:

Object.extend(data1,data2);

答案 2 :(得分:-2)

使用jQuery.extend()

表示深层副本:var object = $.extend({}, object1, object2);

更多信息http://api.jquery.com/jQuery.extend/#jQuery-extend-target-object1-objectN