如何在 JQuery 中复制/克隆哈希/对象?

发布于 2024-11-30 19:56:38 字数 258 浏览 2 评论 0原文

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

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

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

I have a simple object (or hash) in Javascript:

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

I need a copy of it. Is there a settings.clone() type method that will give me another object with the same attributes? I'm using jQuery, so happy to use a jQuery utility method if one exists.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

旧故 2024-12-07 19:56:38

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

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

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

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

将返回:

{a:1, b:2}

具有相同的逻辑:

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

将返回:

{foo:'bar', test:123}

即有效的克隆。

Yes, extend an empty object with the original one; that way, everything will simply be copied:

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

Extending some filled object with another, e.g.:

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

will return:

{a:1, b:2}

With the same logic:

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

will return:

{foo:'bar', test:123}

i.e. effectively a clone.

执笏见 2024-12-07 19:56:38

以非 jQuery 的方式。

var newObj = {};

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

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

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

In a non jQuery way.

var newObj = {};

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

This copies only the top-level properties. To copy hashes with nested objects as property values, you will need to use a recursive function.

NB: The Object.keys(settings) avoids the need for calling settings.hasOwnProperty(key).

小糖芽 2024-12-07 19:56:38
var clone = $.extend(true, {}, settings);

将第一个参数设置为 true。

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

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

Set first argument to true.

EDIT: First argument true signifies deep copy. For given example in original question there is no need for deep copy since there are simple immutable key-value pairs. For question in title - as a general case - use deep copy. Otherwise you get half-copy.

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

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

It sounds like you want jQuery extend, which can copy an object for you.

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

半夏半凉 2024-12-07 19:56:38

我的 2 美分:

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

  return object;
}

它可能不是最优化的选项,但对于某些场景来说它可能很方便。

My 2 cents:

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

  return object;
}

It may not be the most optimized option but it can be handy for some scenarios.

荒芜了季节 2024-12-07 19:56:38

如果您不使用 jQuery,Underscore.js 还有一个扩展函数

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

_.extend({name: 'moe'}, {age: 50});
=> {姓名:“萌”,年龄:50}

Underscore.js also has an extend function if you are not using jQuery:

extend _.extend(destination, *sources) Copy all of the properties in the source objects over to the destination object, and
return the destination object. It's in-order, so the last source will
override properties of the same name in previous arguments.

_.extend({name: 'moe'}, {age: 50});
=> {name: 'moe', age: 50}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文