【发布时间】:2011-07-18 21:22:03
【问题描述】:
下面先记录0,再记录1。如何存储对象的副本,而不是引用?
debug.log(vi.details.segment);
vi.nextSegment = vi.details;
vi.nextSegment.segment++;
debug.log(vi.details.segment);
【问题讨论】:
标签: javascript jquery arrays object clone
下面先记录0,再记录1。如何存储对象的副本,而不是引用?
debug.log(vi.details.segment);
vi.nextSegment = vi.details;
vi.nextSegment.segment++;
debug.log(vi.details.segment);
【问题讨论】:
标签: javascript jquery arrays object clone
在 jQuery 中克隆一个对象:
var vi.nextSegment = jQuery.extend({}, vi.details);
注意:以上是浅拷贝:任何嵌套对象或数组都将通过引用进行复制——这意味着您对vi.nextSegment.obj[prop] 所做的任何更改都将反映在vi.details.obj[prop] 中。如果您想要一个全新的对象,与原始对象完全分离,您需要进行深层复制(将true 作为第一个参数传递):
var vi.nextSegment = jQuery.extend(true, {}, vi.details);
要了解更多关于扩展的信息,请参阅here.
【讨论】:
var a = {b: [1, 2]}; $.extend({}, a).b[0] = 'test'; 和 a.b[0] 将更改为 'test'。要进行深层复制,请将true 作为第一个参数:$.extend(true, {}, a);
jQuery.extend(true, {}, obj); 将创建一个副本。 jQuery.extend(true, obj, {}); 不会。
看帖子:What is the most efficient way to clone a javascript object
根据John Resig's 回答:
// Shallow copy
var newObject = jQuery.extend({}, oldObject);
// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);
更多信息可以在jQuery documentation.找到
【讨论】:
这对我使用 jQuery "parseJSON()" 和 "JSON.stringify()" 克隆对象效果更好
$.ajax({
url: 'ajax/test.html',
dataType: 'json',
success: function(data) {
var objY = $.parseJSON(JSON.stringify(data));
var objX = $.parseJSON(JSON.stringify(data));
}
});
在 objX 和 objY 中克隆数据对象是两个不同的对象,你不必搞砸“按引用”的问题
感谢!
【讨论】:
另一种克隆对象的方法是
newObj = JSON.parse(JSON.stringify(oldObj));
但如果它包含日期,请小心。在这种情况下,JSON.parse 将返回 date.toString() 而不是 date。
【讨论】:
这就是我多次复制元素的方式:
首先我有一个模板:
<div class="forms-container">
<div class="form-template">
First Name <input>
.. a lot of other data ...
Last Name <input>
<div>
<button onclick="add_another();">Add another!</button>
<div>
现在,JavaScript:
function add_another(){
jQuery(".form-template").clone().appendTo(".forms-container");
}
【讨论】:
Immutable.js:由于jQuery 主要处理DOM Elements,它可能不是适合这项工作的工具。 Immutable.js 是由Facebook 创建的56 kb (minified) 库。
// roughly implementing
import Immutable from 'immutable'
//
const oldObj = { foo: 'bar', bar: 'baz' }
// create a map from the oldObj and then convert it to JS Object
const newObj = Immutable.Map(oldObj).toJS()
这样您就可以有效地从oldObj 克隆newObj。基本上,如果您还没有Map,那么我们需要先创建一个Map。地图就像一个blue-print,我们一起创建copies。
首页 - Immutable
文档 - Immutable Docs
GitHub - Immutable@GitHub
祝你好运。
【讨论】:
如果您需要保留初始对象但需要使用新选项覆盖数据,您可以将多个对象传递给 $.extend (jQuery),第一个选项为 true:
var opts_default = {opt1: true, opt2: false};
var opts_new = {opt1: false};
var opts_final = $.extend(true, {}, opts_default, opts_new);
【讨论】: