按数字排序的Javascript排序即使使用比较功能也不起作用。为什么?

时间:2017-11-16 09:18:31

标签: javascript arrays sorting sortcomparefunction

我有一个函数可以按数字求和对整数数组进行排序,如果数字总和等于数字值排序。这是功能:

function s(g){
    var r=0;
    while(g)r+=g%10,g/=10;
    return r;
}
function digitalSumSort(a) {
    a.sort(function(x,y){
        return s(x)!=s(y)?s(x)-s(y):x-y;
    });
    return a;
}

它有时可以正常工作,但在此测试数据上失败了:

输入:[100,22,4,11,31,103]

输出:[100,11,31,4,22,103]

预期产出:[100,11,4,22,31,103]

我无法弄清楚为什么会这样做,以及如何解决它?

注意:代码中包含尽可能少的字符非常重要!

修改 这个问题已经得到了回答,但我最近犯了同样的错误并想到了这一点。在给定数值时,有没有办法让var充当integer(而不是double)。我学会了使用地板的技巧,但有时我只想要integer操作而不是double(有些系统它们更快,我可能有其他原因)。

2 个答案:

答案 0 :(得分:1)

主要问题在于s函数,因为当g是分数时,它会继续循环并收集值。

此外,您可以使用Schwartzian transform aka decorate-sort-undecorate,而不是在排序时计算值。您创建一个数组,其中包含您将用于对数组进行排序,排序的计算值,而不是映射回原始值。

function s(g) {
  var r = 0;
  while (g) r += g % 10, g = Math.floor(g/10); // round g down to skip redundent loops when g is a fraction
  return r;
}

function digitalSumSort(a) {
  return a
    .map(function(n) { // create an array with theorigina and the computed values
      return [s(n), n];
    })
    .sort(function(a, b) {
      return a[0] === b[0] ? a[1] - b[1] : a[0] - b[0]; // sort by the computed or original values
    })
    .map(function(n) { // get back an array of the original values
      return n[1];
    });
}

console.log(digitalSumSort([100, 22, 4, 11, 31, 103])); // [100, 11, 4, 22, 31, 103]

答案 1 :(得分:0)

感谢@JJJ,他写道:“提示:打印出s()返回的内容(console.log(s(22))等等。”

我终于注意到函数s()返回不正确的值。

此代码有效:

function s(g){
    var r=0;
    while(g)r+=g%10,g=Math.floor(g/10);
    return r;
}
function digitalSumSort(a) {
    a.sort(function(x,y){
        return s(x)!=s(y)?s(x)-s(y):x-y;
    });
    return a;
}