在深入研究数组方法时,我决定看一下 Array.sort 方法中涉及的步骤。看一下这段代码,用于反转数组的顺序:
let arr = [];
for (let i = 1; i < 6; i++) {
arr.push(i);
}
arr.sort((value1, value2) => {
console.log(arr);
console.log(`Comparing ${value1} : ${value2}`);
return value2 - value1;
});
console.log(arr);
我得到这个输出:
[1, 2, 3, 4, 5]
Comparing 1 : 2
[2, 1, 3, 4, 5]
Comparing 1 : 3
[2, 1, 1, 4, 5]
Comparing 2 : 3
[3, 2, 1, 4, 5]
Comparing 1 : 4
[3, 2, 1, 1, 5]
Comparing 2 : 4
[3, 2, 2, 1, 5]
Comparing 3 : 4
[4, 3, 2, 1, 5]
Comparing 1 : 5
[4, 3, 2, 1, 1]
Comparing 2 : 5
[4, 3, 2, 2, 1]
Comparing 3 : 5
[4, 3, 3, 2, 1]
Comparing 4 : 5
[5, 4, 3, 2, 1]
前两步很有意义,但请看第三步:[2, 1, 1, 4, 5]
。
当我期望 [2, 3, 1, 4, 5]
时,为什么会出现这种情况?
如您所见,这种重复的数字现象一次又一次地出现,直到数组最终被反转。我错过了什么?很明显,在 arr
中的每个突变之后,它都保留了数组的副本。
最佳答案
当数组是小型浏览器(好吧……至少是 chrome、safari 和 node)时使用插入排序。您看到的行为是在插入排序循环中间查看数组的结果。您可以通过以下方式重现它:
let arr = [ 1, 2, 3, 4, 5];
function InsertionSort(a, comparefn) {
let from = 0
let to = a.length
for (var i = from + 1; i < to; i++) {
var element = a[i];
for (var j = i - 1; j >= from; j--) {
var tmp = a[j];
var order = comparefn(tmp, element); //<-- your console.log is peaking at the array here
if (order > 0) {
a[j + 1] = tmp;
} else {
break;
}
}
a[j + 1] = element;
}
};
InsertionSort(arr, (a,b) => {
console.log(arr.join(","))
return b-a
})
console.log(arr)
请记住,这不是必需的实现,因此您不必指望这种行为。
关于javascript - Array.sort 的这个中间阶段发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52374681/