JavaScript 中的 Array.sort() - 我在一次面试中被问到这个问题
我在一次面试中收到了一组字符串。
const arr = [
"karachi",
"lahore",
"kolachi",
"islamabad"
]
他让我按字母顺序排列。
我试过:
arr.sort((a, b) => {
return a < b;
});
他说它对数字有效(实际上不行),但对字符串无效。
然后我尝试
arr.sort((a, b) => {
return a.charAt(0) < b.charAt(0);
});
他说它只对第一个字符起作用(实际上不会),那么如何karachi
和kolachi
从...开始k
进行排序?
我一片空白。
他说什么是a
和b
?
我说的a
是当前元素(当前迭代索引处的元素)并且b
是下一个元素(当前迭代 + 1 索引处的元素)。
👉 但实际上,它是相反的。a
是下一个元素,b
是当前元素。
然后他问,排序是否会修改原始数组或返回一个新数组。
老实说,大多数时候我都在使用.map()
、、和。所以我知道这些方法的行为.filter()
,但我不记得上次使用是什么时候。.some()
.every()
.sort()
我说的是,它不会修改原始数组,而是返回一个像这样的新数组.map()
。
👉 但事实恰恰相反。.sort()
修改原始数组并返回对原始数组的引用,该数组现在已排序。
究竟如何.sort()
运作?
Array.sort()
接受可选的比较函数作为参数。
如果我们不提供任何比较函数,sort 方法会将所有non-undefined
元素转换为字符串,然后比较它们的 UTF-16 代码单元值序列。
“比较它们的 UTF-16 代码单元值序列”是什么意思?
简单来说,假设我们a
在 JavaScript 中写入一个以 UTF-16 编码的字符。它的十进制值为97
。因此,b
它的值为98
。即A
= 65
B
= 66
C
=67
等等。
我想你应该了解 ASCII 码表。
因此基本上字符串数组将自动按.sort()
方法正确排序,而无需传递任何比较函数。
👉 如果是数字,行为是一样的;
const arr = [1, 30, 4, 21, 100000];
arr.sort();
console.log(arr);
// expected output: [1, 100000, 21, 30, 4]
因为每个数字首先被转换成字符串,然后根据它们的 UTF-16 代码单元值进行比较。
但是如果我们提供一个比较函数来根据数字进行排序:
const arr = [1, 5, 3, 10, 7]
arr.sort((nextValue, prevValue) => {
// if returnValue > 0, move nextValue after the prevValue
// if returnValue < 0, move the nextValue before the prevValue
// if returnValue === 0, keep the original order, do not move any value
return nextValue - prevValue;
});
因此,排序方法可以这样理解:
function compareFunction(a, b) {
if (a is less than b by some ordering criterion) {
return -1;
}
if (a is greater than b by the ordering criterion) {
return 1;
}
a must be equal to b
return 0;
}
我希望这能让事情变得更清楚Array.sort()
这篇文章就到这里。请在下方评论区写下你的想法!
鏂囩珷鏉yu簮锛�https://dev.to/mhm13dev/arraysort-in-javascript-i-was-asked-about-this-in-an-interview-387