2014-09-25 65 views
0

我正在研究一個項目,其中有一個數組變量突然包含與另一個相同的問題。隨着懶惰的人的警告提示的幫助下,我已經縮小的問題降到這段代碼,這裏的一切突然出錯:鏈接在一起的JavaScript變量沒有很好的理由

// The array "data" is the result of a JSON request - this works fine.. 
// "data" is a two-dimensional array. 
allShowsVars = data.slice(); 
allShowsVars.sort(function(a, b) { 
    var aL = a[1].toLowerCase(), bL = b[1].toLowerCase(); 
    if(aL < bL) return -1; 
    else if(aL > bL) return 1; 
    else return 0; 
}); 
// At this moment, the allShowsVars variable holds the right contents from the data array.. 
showsVars = allShowsVars.slice(); // Here, we make a copy of allShowsVars.. 
for(var iS = 0, sPos; typeof showsVars[iS] != 'undefined'; iS++) { 
    sPos = showsVars[iS][1].indexOf(" - Season "); 
    if(sPos != -1) { 
     showsVars[iS][1] = showsVars[iS][1].slice(0,sPos); 
     if(iS > 0) { 
      if(showsVars[(iS-1)][1] == showsVars[iS][1]) showsVars.splice(iS,1); 
      iS--; 
     } 
    } 
} 
// I changed showsVars in the above for loop, cutting out " - Season ......" in a lot of entries. 

現在,allShowsVars也有新的,從showsVars改變的內容。爲什麼??? 變量沒有鏈接在一起! 我在想我錯過了某處明顯的東西。我只是需要一個聰明的人看到它:)

+1

'slice()'拷貝數組,但不是其中的值。 'showsVars [x]'和'allShowsVars [x]'仍然指向同一個對象。 – georg 2014-09-25 08:09:22

+0

非常感謝。我錯過了那個小細節。 – markj 2014-09-25 08:56:03

回答

1

這是來自MDN的documentation of Array.prototype.slice()

對於對象引用(而不是實際對象),slice將對象引用複製到新數組中。原始數組和新數組都指向同一個對象。如果引用的對象發生更改,則這些更改對新數組和原始數組均可見。

這是發生在你的情況。

你可以使用這個技巧來深複製一個數組:

var deepCopy = JSON.parse(JSON.stringify(sourceArray)); 

的JavaScript數組/對象的深度複製見herehere

+0

接受,因爲它是解決方案最全面的答案。非常感謝你。 – markj 2014-09-25 09:01:47

+1

剛剛發現這一個,這真的給了一些很好的見解以及速度比較:http://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-clone-an-object – markj 2014-09-25 09:31:17

2

slice()只執行淺拷貝。原始值直接被複制,但嵌套對象在內部被視爲引用,因此兩個數組最終指向相同的對象。

+0

謝謝。這也是一個很好的解釋。 – markj 2014-09-25 09:03:02

相關問題