Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript数组自动排序_Javascript_Arrays_Sorting - Fatal编程技术网

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:)中工作,如果您插入的代码正确-您可以直接在上面运行它!给你修好了