【问题标题】:Replace one object's properties with the properties of another?用另一个对象的属性替换一个对象的属性?
【发布时间】:2015-01-25 06:31:13
【问题描述】:

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

我有一个对象:

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

【问题讨论】:

  • 不破坏引用是什么意思?
  • 对不起,这很不一样。
  • 所以您想将data2 的所有属性浅拷贝到data1 中,覆盖data1 已经拥有的任何同名属性?使用简单的for..in 循环不是那么容易吗?
  • @AlexanderO'Mara 这不是那个问题的重复。
  • @FaridNouriNeshat 更新后我明白你的意思了,我改进了标题并指定了重新打开的问题。

标签: javascript clone


【解决方案1】:

你可以使用这个功能:

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);
}

【讨论】:

    【解决方案2】:

    试试:

    Object.extend(data1, data2);

    【讨论】:

    • 但这会将data2的属性添加到data1,而不是替换
    【解决方案3】:

    使用jQuery.extend()

    对于深拷贝:var object = $.extend({}, object1, object2);

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

    【讨论】:

    • 这会将属性从两个对象复制到一个新对象。 1.它会破坏引用,2.它不会清除原始属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    相关资源
    最近更新 更多