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

4

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

我有一个对象:

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


不破坏引用是什么意思? - nnnnnn
抱歉,这非常不同。 - diwatu
所以你想将data2的所有属性浅复制到data1中,覆盖data1已有的同名属性?用一个简单的for..in循环不是很容易实现吗? - nnnnnn
@AlexanderO'Mara 这不是那个问题的副本。 - Farid Nouri Neshat
@FaridNouriNeshat,我看到你的意思了,在更新后,我已经改进了标题并提名问题重新开放。 - Alexander O'Mara
3个回答

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,你可以在src属性更改时更新dest
function replaceProperties(dest, src)  {
    for (var i in dest) 
        delete dest[i];
    Object.setPrototypeOf(dest, src);
}

1
尝试:

Object.extend(data1, data2);


但这将会把data2的属性添加到data1中,而不是替换。 - diwatu

-2

1
这将从两个对象复制属性到一个新对象中。1. 它会打破引用,2. 它不会清除原始属性。 - Slava Fomin II

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接