如何正确排序整数数组

IT技术 javascript arrays sorting numbers
2020-12-22 16:28:48

试图从我知道只包含整数的数组中获取最高和最低值似乎比我想象的要难。

var numArray = [140000, 104, 99];
numArray = numArray.sort();
console.log(numArray)

我希望这能显示99, 104, 140000. 相反,它显示104, 140000, 99. 因此,排序似乎将值作为字符串处理。

有没有办法让排序函数对整数值进行实际排序?

6个回答

默认情况下, sort 方法按字母顺序对元素进行排序。要按数字排序,只需添加一个处理数字排序的新方法(sortNumber,如下所示) -

var numArray = [140000, 104, 99];
numArray.sort(function(a, b) {
  return a - b;
});

console.log(numArray);

文档:

MozillaArray.prototype.sort()建议对不包含 Infinity 或 NaN 的数组使用此比较函数。(因为Infinity - Infinity是 NaN,而不是 0)。

还有按键对对象进行排序的示例。

可以使用箭头函数缩短此代码numberArray.sort((a, b) => (a - b));好极了!我认为这接近于开箱即用的方式。注意:检查您的 JS 引擎是否支持箭头函数。
2021-02-12 16:28:48
啊哈这是开箱即用的!但是如果你真的不切实际,你可以在 javascript 的最开始将函数绑定到数组类类: // Array.prototype.sortNormal = function(){return this.sort(function(a,b){return a - b})} // 现在对任何数组调用 .sortNormal() 都会对其进行数字排序
2021-02-20 16:28:48
为什么是 ab 而不是 a>b。我建议最后一个以避免操作机器错误
2021-02-23 16:28:48
@Velthune 比较函数应返回 -1、0 或 +1。a>b 只会返回 true 或 false。
2021-02-26 16:28:48
好的。但是真的没有开箱即用的方法来从 javascript 中获取数字排序吗?
2021-02-28 16:28:48

仅基于上述所有答案,它们也可以在一行中完成,如下所示:

var numArray = [140000, 104, 99];
numArray = numArray.sort(function (a, b) {  return a - b;  });

//outputs: 99, 104, 140000
我想你的意思是用一种表达方式。
2021-02-24 16:28:48
@bodyflex 固定:var arr = [140000, 104, 99].sort(function(a,b) { return a-b; });或者更紧凑,在 ES6 中let arr = [140000, 104, 99].sort((a,b) => a-b);
2021-03-03 16:28:48

我很惊讶为什么每个人都建议将比较器函数传递给sort(),这使得排序真的很慢!

要对数字进行排序,只需创建任何 TypedArray

var numArray = new Float64Array([140000, 104, 99]);
numArray = numArray.sort();
console.log(numArray)

我用负数尝试了这个,但得到了一个奇怪的结果: > new Uint32Array([ -4, -7, 1, 4 ]).sort()返回Uint32Array(4) [ 1, 4, 4294967289, 4294967292 ]
2021-02-10 16:28:48
@Nikolay D 那些没有签名。您可以使用 Int32Array。
2021-02-11 16:28:48
确保对类型化数组进行排序更快。但是如果你有一个普通的数组,把它转换成一个类型化的数组来排序就不是一个好的解决方案(速度和内存)
2021-02-13 16:28:48
@Gio 不确定这是真的。内存要求仅为 O(2n),对于一百万个项目的数组来说只有几兆字节。至于速度 - 将数组转换为 typedarray,排序和转换回来仍然比使用函数对数组进行排序要快。
2021-02-19 16:28:48
使用 TypedArray 可将排序速度提高约 5 倍。如果你想走得更快,hpc-algorithms npm 包实现了这里有几个答案所建议的基数排序和计数排序。
2021-02-22 16:28:48

array.sort默认情况下进行字典排序,对于数字排序,提供您自己的函数。这是一个简单的例子:

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

numArray.sort(compareNumbers);

另请注意,排序“就地”工作,不需要分配。

我没看懂上面的代码,"return a - b" 是如何升序排序的?
2021-02-14 16:28:48
如果 a < b,compareNumbers 返回一个负数。如果 a > b,则为正。如果相等,则返回 0。
2021-03-06 16:28:48
@AliMertCakar 因为它只返回 true 或 false,并且比较函数需要返回负数、零或正数。
2021-03-07 16:28:48

这个答案等同于一些现有的答案,但 ECMAScript 6箭头函数提供了一种更紧凑的语法,允许我们在不牺牲可读性的情况下定义内联排序函数:

numArray = numArray.sort((a, b) => a - b);

现在大多数浏览器都支持它