【问题标题】:How to copy/clone a hash/object in JQuery?如何在 JQuery 中复制/克隆哈希/对象?
【发布时间】:2011-10-30 03:25:19
【问题描述】:

我在 Javascript 中有一个简单的对象(或哈希):

var settings = {
  link: 'http://example.com',
  photo: 'http://photos.com/me.jpg'
};

我需要它的副本。是否有一个settings.clone() 类型的方法会给我另一个具有相同属性的对象?我正在使用 jQuery,如果存在 jQuery 实用方法,我很高兴使用它。

【问题讨论】:

  • Copying an Object in Javascript 的可能重复项
  • 恕我直言,这应该重命名为“如何在 jquery 中复制/克隆哈希/对象”。那么它就会与上面的副本不同。

标签: javascript jquery copy clone javascript-objects


【解决方案1】:

是的,extend 一个空对象与原始对象;这样,所有内容都将被简单地复制:

var clone = $.extend({}, settings);

用另一个填充的对象扩展一些填充对象,例如:

$.extend({a:1}, {b:2})

将返回:

{a:1, b:2}

同理:

$.extend({}, {foo:'bar', test:123})

将返回:

{foo:'bar', test:123}

即实际上是一个克隆。

【讨论】:

  • 不正确;包含的对象仍然通过引用传递,而不是深度克隆,例如a={aa:{aaa:3}}; b=$extend({},a}; a.aa.aaa=4; b.aa.aaa==4 !!
  • @BerryTsakala:从 JQuery 1.1.4 开始,您可以使用 extend(true, ...) 创建深层副本。
【解决方案2】:

以非 jQuery 方式。

var newObj = {};

Object.keys(settings).forEach(function(key) {
     newObj[ key ] = settings[ key ];
}); 

这仅复制顶级属性。要将嵌套对象的散列复制为属性值,您将需要使用递归函数。

注意:Object.keys(settings) 避免了调用settings.hasOwnProperty(key) 的需要。

【讨论】:

  • +1 只是为了确保,hasOwnProperty 将是一个很好的补充。 (明天我达到投票上限时+1 :))
  • 我修改了代码,不再需要hasOwnProperty
【解决方案3】:
var clone = $.extend(true, {}, settings);

将第一个参数设置为 true。

编辑:第一个参数true 表示深拷贝。对于原始问题中的给定示例,由于存在简单的不可变键值对,因此不需要深拷贝。对于标题中的问题 - 作为一般情况 - 使用深拷贝。否则你会得到一半的副本。

【讨论】:

  • 如果你想要一个深拷贝,你只需要true
【解决方案4】:

听起来你想要 jQuery 扩展,它可以为你复制一个对象。

http://api.jquery.com/jQuery.extend/

【讨论】:

    【解决方案5】:

    我的 2 美分:

    function clone(hash) {
      var json = JSON.stringify(hash);
      var object = JSON.parse(json);
    
      return object;
    }
    

    它可能不是最优化的选项,但在某些情况下它可以很方便。

    【讨论】:

    • 对于大多数用途来说,这非常好..但它会错过以undefined为值的键
    【解决方案6】:

    Underscore.js also has an extend function 如果你没有使用 jQuery:

    extend _.extend(destination, *sources) 将源对象中的所有属性复制到目标对象,然后 返回目标对象。它是有序的,所以最后一个来源将 覆盖先前参数中的同名属性。

    _.extend({name: 'moe'}, {age: 50});
    => {name: 'moe', age: 50}
    

    【讨论】:

    • 或者更具表现力:var new_obj = _.clone( old_obj );
    猜你喜欢
    • 2013-12-19
    • 2011-03-29
    • 2013-04-06
    • 1970-01-01
    • 2011-02-07
    • 2011-10-17
    • 1970-01-01
    • 2018-12-23
    • 2012-06-19
    相关资源
    最近更新 更多