2014-03-13 21 views
0

更新 經過進一步測試,確實似乎可行,但控制檯輸出不正確;兩個陣列仍然看起來完全一樣。爲什麼我的數組在我洗牌時沒有被重新分配?


我使用如由這篇文章(靠近底部代碼)中所述的費 - 耶茨(德納)洗牌:http://bost.ocks.org/mike/shuffle/

此代碼正確地混洗元件的陣列。我已經在控制檯中進行了測試以驗證。我正在研究一個項目,我需要對一組數組進行混洗。這段代碼可以正確地洗牌數組,因爲它是數據不可知的。

但是,當我嘗試將數組分配給新值時,它不會更改。例如:

data = [['1','2','3'],['4','5','6'],['7','8','9'],['10','11','12']]; 
data = shuffle(data); //Value of data does not change, even though shuffle works 

當我在控制檯中執行

shuffle(data); 

它返回陣列的正確混洗陣列。

我創造了這個的jsfiddle所以你可以看到:http://jsfiddle.net/herbstmb/Ve24U/

如果您在控制檯明確洗牌的作品看,但分配失敗。

非常感謝任何幫助瞭解正在發生的事情。

+0

使用Chrome瀏覽器在這裏工作得很好! – adeneo

+0

對我也適用 – ochi

+1

由於對'data'的引用永遠不會改變,所以輸出在你登錄數組時都是相同的。如果你用'console.log(JSON.stringify(data))'替換'console.log(data)',你會看到不同的值。 –

回答

2

它的確如此。數組是可變的。你在控制檯中得到相同的日誌,因爲它們都是混洗結果。您首先記錄了非混洗陣列,但在混洗後您檢查了它,然後它已經發生了變化。檢查控制檯和源代碼中的數組值,它們是不同的。

+0

因此,在洗牌之前記錄的值在洗牌之後也會更新,這就是爲什麼我認爲它不工作,即使它是? –

+0

它不會更改控制檯中的值。在調用'shuffle'之前,'log'只是沒有對數組進行評估。如果在第一個'console.log'之後但是在'shuffle'之前有延遲,我希望看到不同的結果。 – Colton

+0

@JuanGarcia是正確的。在Javascript中,變量是可變的,並通過引用傳遞。如果您想使其功能正常,可以在Shuffle方法內複製數組並返回混洗版本。這將確保變量數據保持不變。 – Pete

相關問題