如何使用Array.prototype.sort()排序包含重复值的数组?

3

我想使用 Array.prototype.sort() 来对带有重复值的数组进行排序。

例如,如果我执行这个语句 [1, 2, 0, 1].sort((a, b) => a + b),以便按降序获得排序后的数组,我会得到相同的数组 [1, 2, 0, 1]

为什么会发生这种情况?我该如何使用 Array.prototype.sort 对这个数组进行排序?是因为 JavaScript 的 Array sort 对于排序重复的值不可靠,还是我提供的函数没有做出正确的比较?我希望能够使用 Array.prototype.sort 实现这一点,而不必编写自己的排序函数。

谢谢!


.sort((a, b) => a - b) 可能会用到。而且 sort 不会返回一个新的数组,它会改变现有的数组。 - Eddie
2个回答

3

您需要减去这两个值。

//ascending order
console.log([1, 2, 0, 1].sort((a, b) => a - b))

//descending order
console.log([1, 2, 0, 1].sort((a, b) => b - a))


0

它不起作用的原因是:

如果你看一下官方MDN文档,

sort()方法会原地排序数组元素并返回该数组。默认排序顺序是通过将元素转换为字符串,然后比较它们来构建的。

var months = ['March', 'Jan', 'Feb', 'Dec'];
months.sort();
console.log(months);
// expected output: Array ["Dec", "Feb", "Jan", "March"]

var array1 = [1, 2, 0, 1];
array1.sort((a, b) => a + b);
console.log(array1);
// expected output: Array [1, 2, 0 ,1]

因此,为了比较数字而不是字符串,比较函数可以简单地将 b 从 a 中减去。如果以下函数不包含 Infinity 和 NaN,则会升序排序数组。

function compareNumbers(a, b) {
  return a - b;
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接