在实现冒泡排序算法时,我注意到在对象中记录数组与直接记录数组产生不同的结果。为什么?
function bubbleSort(arr) {
let array = [...arr];
let sorted = false;
let round = 0;
while (!sorted) {
sorted = true;
console.log({ array }); // this shows the already sorted array
console.log(array); // this shows the array after one round of sorting
for (let i = 0; i < array.length - 1 - round; i++) {
if (array[i] > array[i + 1]) {
[array[i], array[i + 1]] = [array[i + 1], array[i]];
sorted = false;
}
}
round++;
}
return array;
}
bubbleSort([1,4,6,3,45,78,9])
答案 0 :(得分:1)
您的声明无效。
此代码显示console.log
都在每一轮中打印相同的数组。
function bubbleSort(arr) {
let array = [...arr];
let sorted = false;
let round = 0;
while (!sorted) {
sorted = true;
console.log({ array }, `Round no. ${round}`); // this shows the already sorted array
console.log(array, `Round no. ${round}`); // this shows the array after one round of sorting
for (let i = 0; i < array.length - 1 - round; i++) {
if (array[i] > array[i + 1]) {
[array[i], array[i + 1]] = [array[i + 1], array[i]];
sorted = false;
}
}
round++;
}
return array;
}
bubbleSort([10,7,15,1]);
这是我执行此代码段时得到的
{
"array": [
10,
7,
15,
1
]
} Round no. 0
[
10,
7,
15,
1
] Round no. 0
{
"array": [
7,
10,
1,
15
]
} Round no. 1
[
7,
10,
1,
15
] Round no. 1
{
"array": [
7,
1,
10,
15
]
} Round no. 2
[
7,
1,
10,
15
] Round no. 2
{
"array": [
1,
7,
10,
15
]
} Round no. 3
[
1,
7,
10,
15
] Round no. 3
PS:如果您是说要在Chrome控制台(或类似的控制台)中打开它,并且看起来像,则取决于该控制台的实现。
array
和{ array }
的值都是在内存中保留数组值的位置。这些值正在变化,因此,如果它没有在您记录日志时保留数组的值,而是存储段的值,那么在扩展它时,它会显示当前值,而不是历史值。 / p>
答案 1 :(得分:1)
也许一个简单的例子会更清楚:
在控制台中输入以下内容:
const arr = [1, 2, 3];
const obj = {arr};
console.log(obj)
不要打开对象
现在的类型:
arr[0] = 11;
...然后从上面的行中打开对象。它应显示为[11,2,3],因为当您在控制台中打开对象时,它会显示{arr}
当时的状态,而不是记录时的状态。