下面的第一個日誌爲0,然後是日誌1.如何存儲對象的副本,而不是對它的引用?在javascript中克隆對象
debug.log(vi.details.segment);
vi.nextSegment = vi.details;
vi.nextSegment.segment++;
debug.log(vi.details.segment);
下面的第一個日誌爲0,然後是日誌1.如何存儲對象的副本,而不是對它的引用?在javascript中克隆對象
debug.log(vi.details.segment);
vi.nextSegment = vi.details;
vi.nextSegment.segment++;
debug.log(vi.details.segment);
爲了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.
看看帖子:
按What is the most efficient way to clone a javascript objectJohn 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是兩個不同的對象,你不必搞亂「參考」的問題
Gracias!
我喜歡這個:0) – kiranvj 2015-05-11 20:06:55
你可以做到這一點沒有jquery 使用JSON.parse內置方法 – MarkosyanArtur 2017-03-24 04:12:24
這是我的元素複製幾次:
首先我有一個模板:
<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");
}
另一種方式來克隆對象
newObj = JSON.parse(JSON.stringify(oldObj));
但要小心,如果它包含日期。在這種情況下,JSON.parse將返回date.toString()而不是日期。
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
。地圖就像我們用來創建copies
的blue-print
。
首頁 -Immutable
文檔 -Immutable Docs
GitHub的 -[email protected]
好運。
這不是一個深層複製。 'var a = {b:[1,2]}; $ .extend({},a).b [0] ='test';'和'a.b [0]'將被更改爲'test'。要進行深層複製,請將'true'作爲第一個參數:'$ .extend(true,{},a);' – Reid 2011-03-19 20:25:22
我忘記了包含深層複製,我只是編輯了我的答案。 – 2011-03-19 20:26:31
剛剛得到我的一個gothcha:'jQuery.extend(true,{},obj);'會創建一個副本。 'jQuery.extend(true,obj,{});'不會。 – worldsayshi 2013-04-21 21:41:16