JavaScript数组自动排序
我正在尝试编写一个气泡排序动画——为此,我想将所有迭代放在单独的数组中,然后再复制它们。但是JavaScript数组自动排序,javascript,arrays,sorting,Javascript,Arrays,Sorting,我正在尝试编写一个气泡排序动画——为此,我想将所有迭代放在单独的数组中,然后再复制它们。但是array变量行为怪异-所有console.dir(array)输出都是排序数组,因此池中的似乎有9个相同的数组[[1,2,3],[1,2,3]…]我希望看到排序算法的所有迭代:[[2,3,1],[2,1,3]]] 谁能告诉我我做错了什么,最重要的是,为什么arrayarray总是被排序 注意:代码片段在这里工作,但在浏览器或JSFIDLE中无法正常工作 代码段: const pool=[]; 常量bu
array
变量行为怪异-所有console.dir(array)
输出都是排序数组,因此池中的似乎有9个相同的数组[[1,2,3],[1,2,3]…]
我希望看到排序算法的所有迭代:[[2,3,1],[2,1,3]]]
谁能告诉我我做错了什么,最重要的是,为什么array
array总是被排序
注意:代码片段在这里工作,但在浏览器或JSFIDLE中无法正常工作
代码段:
const pool=[];
常量bubbleSort=(数组)=>{
const len=array.length;
for(设i=0;i数组[j+1]){
常数tmp=数组[j];
数组[j]=数组[j+1];
阵列[j+1]=tmp;
}
pool.push(数组);
console.dir(数组);
}
}
}
气泡运动([3,2,1]);
控制台日志(池)代码>我认为解决方案与这样一个事实有关,即当您推到池
堆栈时,JavaScript数组在某种程度上保持了一种“通过引用传递”的情况。你可以试试
pool.push(array.slice()); // This creates a new instance of the array
您还可以阅读本文,了解数组的可变性。我认为解决方案与以下事实有关:当您推到池堆栈时,JavaScript数组会保持某种“通过引用传递”的情况。你可以试试
pool.push(array.slice()); // This creates a new instance of the array
您还可以阅读本手册,了解数组的可变性。您必须了解两件事:
- 变量
array
引用可变数组。这意味着每次交换两个元素时,都会修改数组
- 执行
pool.push(array)
操作时,将引用推入池中李>
在代码中,在池中按n次相同的引用。
因此,内存中只有两个数组:pool
和array
(即示例中的[3,2,1]
)
每次修改数组
(通过交换元素),都会修改存储在池中的所有数组(实际上是唯一的数组)
因此,如果要拍摄快照,必须在池中存储阵列的副本:pool.push(array.slice())
关于console.dir
的“奇怪”行为,这来自于此函数的异步性质。请参见您必须了解两件事:
- 变量
array
引用可变数组。这意味着每次交换两个元素时,都会修改数组
- 执行
pool.push(array)
操作时,将引用推入池中李>
在代码中,在池中按n次相同的引用。
因此,内存中只有两个数组:pool
和array
(即示例中的[3,2,1]
)
每次修改数组
(通过交换元素),都会修改存储在池中的所有数组(实际上是唯一的数组)
因此,如果要拍摄快照,必须在池中存储阵列的副本:pool.push(array.slice())
关于console.dir
的“奇怪”行为,这来自于此函数的异步性质。请参见我在JSFIDLE和angular应用程序中尝试了多次-结果相同。顺便说一句,jsfiddle-link:ha,很有趣-它只在REPL:)中工作,如果您插入的代码正确-您可以直接在上面运行它!修正了我在JSFIDLE和angular应用程序中多次尝试的问题-结果相同。顺便说一句,jsfiddle-link:ha,很有趣-它只在REPL:)中工作,如果您插入的代码正确-您可以直接在上面运行它!给你修好了