2014-03-13 68 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

相关问题