我正在接受采访,我得到了一系列的弦乐。
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
?
i说a
是当前元素(当前迭代索引处的元素),而b
是下一个元素(当前迭代+1索引处的元素)。
ð,但实际上是相反的。 a
是下一个元素,b
是当前元素。
然后他问,排序是否修改了原始数组或返回新数组。
老实说,大多数时候我正在与.map()
,.filter()
,.some()
和.every()
合作。所以我知道这些方法的行为,但我不记得我上一次使用.sort()
是什么时候。
我说,它不会修改原始数组,而是返回像.map()
一样的新数组。
ð,但情况相反。 .sort()
修改了原始数组,并返回对原始数组的引用,该数组现在已排序。
.sort()
实际上如何工作?
Array.sort()
接受可选的比较函数作为参数。
如果我们不提供任何比较函数,则排序方法将所有non-undefined
元素转换为字符串,然后比较其UTF-16代码单位值的序列。
什么是“比较他们的UTF-16代码单元序列”的含义是什么?
简而言之,假设我们编写了javaScript中编码为UTF-16的字符a
。在十进制中,它的价值将为97
。对于b
,它将是98
。即
Cold23 = Cold24
B
= 66
C
= 67
等等。
我希望您知道ACII表。
因此,基本上,字符串数组将通过.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()
的事情有些清楚
就是这篇文章。在下面的评论中写下您的想法!