2011-03-19 101 views
47

下面的第一個日誌爲0,然後是日誌1.如何存儲對象的副本,而不是對它的引用?在javascript中克隆對象

debug.log(vi.details.segment); 
vi.nextSegment = vi.details; 
vi.nextSegment.segment++; 
debug.log(vi.details.segment); 

回答

95

爲了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.

+9

這不是一個深層複製。 '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

+0

我忘記了包含深層複製,我只是編輯了我的答案。 – 2011-03-19 20:26:31

+4

剛剛得到我的一個gothcha:'jQuery.extend(true,{},obj);'會創建一個副本。 'jQuery.extend(true,obj,{});'不會。 – worldsayshi 2013-04-21 21:41:16

7

找到這個工作更好地爲我克隆使用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

我喜歡這個:0) – kiranvj 2015-05-11 20:06:55

+0

你可以做到這一點沒有jquery 使用JSON.parse內置方法 – MarkosyanArtur 2017-03-24 04:12:24

1

這是我的元素複製幾次:

首先我有一個模板:

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

另一種方式來克隆對象

newObj = JSON.parse(JSON.stringify(oldObj)); 

但要小心,如果它包含日期。在這種情況下,JSON.parse將返回date.toString()而不是日期。

0

嘗試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。地圖就像我們用來創建copiesblue-print

參考文獻:

首頁 -Immutable

文檔 -Immutable Docs

GitHub的 -[email protected]

好運。