我在数字数组上使用Array.prototype.sort()
时发现了一个奇怪的现象,我不确定导致它的原因。
我的目标是使用sort
(不使用reverse
)来反转数组,因此我可以将其链接起来:
const shouldReverse = Math.random() > 0.5,
result = foo().bar().map(...).reverseIf(shouldReverse);
我相信我应该能够使用sort
来实现这一目标,这似乎在某些情况下有效但在其他情况下却无效。
这是一个有效的例子:
const myArray = ['a', 'b', 'c', 'd'],
mySortedArray = myArray.sort(() => 1);
console.log(mySortedArray);
["d", "c", "b", "a"]
一个不起作用的例子:
const myArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'],
mySortedArray = myArray.sort(() => 1);
console.log(mySortedArray);
["f", "k", "a", "j", "i", "h", "g", "b", "e", "d", "c"]
这只发生在Chrome中,并且只有在阵列中有超过10个元素时才会发生 - 这可能是Chrome V8引擎中的某种形式的优化吗?
答案 0 :(得分:3)
不,你不应该。您正在寻找我相信我应该可以使用
来实现这一目标sort
reverse
。
对于已经按升序排序的特定示例,您可以通过传递导致降序的比较函数来实现反转,但这对于具有任意值的任意数组都不起作用。
myArray.sort((a, b) => (a<b)-(b<a));
myArray.sort(() => 1)
那是totally inconsistent comparison function。你不能指望它能发挥作用。
这只发生在Chrome中,并且只有在数组中有超过10个元素时才会发生
这是因为Chrome中的JS引擎对小数组使用了不同的排序算法,它以不同的顺序进行比较,显然总是在第二个参数中使用较高的索引项。你很幸运。