繁体   English   中英

JavaScript 数组对自身进行排序

[英]JavaScript array sorts itself

我正在尝试编写一个冒泡排序动画 - 为此,我想将所有迭代放在单独的数组中,然后重现它们。 但是array变量的行为很奇怪 - 所有的console.dir(array)输出都是排序数组,所以在pool似乎有 9 个相同的数组[[1 ,2 ,3], [1, 2, 3] ... ]我希望看到排序算法的所有迭代: [[2, 3, 1], [2, 1, 3] ... ]]

谁能告诉我我做错了什么,最重要的是,为什么array数组总是排序?

注意:代码段在这里工作,但在浏览器或 jsfiddle 中不能正常工作

代码片段:

 const pool = []; const bubbleSort = (array) => { const len = array.length; for (let i = 0; i < len; i++) { for (let j = 0; j < len; j++) { if (array[j] > array[j + 1]) { const tmp = array[j]; array[j] = array[j + 1]; array[j + 1] = tmp; } pool.push(array); console.dir(array); } } } bubbleSort([3, 2, 1]); console.log(pool);

我认为该解决方案与这样一个事实有关,即当您推送到pool堆栈时,JavaScript 数组会保持某种“通过引用传递”的情况。 你可以试试

pool.push(array.slice()); // This creates a new instance of the array

您还可以阅读此文档以澄清数组的可变性

你必须明白两件事:

  • 可变array指的是可变数组。 这意味着每次交换两个元素时,数组都会被修改
  • 当您执行pool.push(array) ,您将引用推送到pool

在您的代码中,您在pool推送了 n 次相同的引用。 因此,您在内存中只有 2 个数组: poolarray (即在您的示例中为[3,2,1]

每次修改array (通过交换元素)时,都会修改池中存储的所有数组(实际上是唯一数组)。

因此,如果您想拍摄快照,您必须在池中存储阵列的副本: pool.push(array.slice())

关于console.dir的“怪异”行为,这来自该函数的异步性质。 请参阅console.log() 异步还是同步?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM