将数字排序为字符串的标准

时间:2017-05-14 18:14:58

标签: javascript algorithm

我知道这里存在类似的问题Javascript string conversion and array sort,但我的解决方案版本需要帮助。

任务: 数字的权重是其数字的总和。 例如99将具有“权重”18,100将具有“权重”1因此在列表100中将出现在99之前。给定具有正常顺序权重的字符串可以回馈由这些数字的“权重”排序的该字符串?

实施例: “56 65 74 100 99 68 86 180 90”按数字重量排序成为:“100 180 90 56 65 74 68 86 99” FFC成员 当两个数字具有相同的“权重”时,让我们将它们分类为字符串而不是数字:100表示​​180之前,因为它的“权重”(1)小于180(9)的180和90之前的权重由于具有相同的“重量”(9),因此它作为一个字符串出现。

问题: 我唯一缺少的部分是如何做最后一部分,例如180将在207和90之前,类似207在45之前,依此类推。

var arr = [56, 65, 74, 100, 99, 207, 45, 68, 86, 180, 90];
arr.sort(function(a, b) {
  var A = ("" + a).split("").reduce(function(c, d) {
    return Number(c) + Number(d);
  });
  var B = ("" + b).split("").reduce(function(e, f) {
    return Number(e) + Number(f);
  });
  if (A > B) {
    return A - B;
  } else if (A == B) {

    //I ASSUME I SHOULD WRITE SOMETHING HERE

  }
});

console.log(arr);

3 个答案:

答案 0 :(得分:3)

您可以添加排序条件,并将结果与​​String#localeCompare进行比较。

function weight(v) {
    return v.toString().split('').reduce(function (a, b) { return +a + +b; });
}

var array = [56, 65, 74, 100, 99, 207, 45, 68, 86, 180, 90];

array.sort(function (a, b) {
    return weight(a) - weight(b) || a.toString().localeCompare(b);
});

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

我认为你正在寻找像这样的东西

   var arr = [56, 65, 74, 100, 99, 207, 45, 68, 86, 180, 90];
    arr.sort(function(a, b) {
      var A = ("" + a).split("").reduce(function(c, d) {
        return Number(c) + Number(d);
      });
      var B = ("" + b).split("").reduce(function(e, f) {
        return Number(e) + Number(f);
      });
      if (A > B) {
        return A - B;
      } else if (A == B) {
        return a.toString() - b.toString();
      }
    });

    console.log(arr);

希望这有帮助!

答案 2 :(得分:0)

您可以使用sumDigits函数来获取权重,然后在排序调用中调用此函数并进行比较。

var arr = [56, 65, 74, 100, 99, 207, 45, 68, 86, 180, 90];

arr.sort(function(a, b) {
  var A = sumDigits(a);
  var B = sumDigits(b);

  if (A > B) {
    return 1;
  } else {
    return -1;
  }
});

console.log(arr);


function sumDigits(number) {
  var str = number.toString();
  var sum = 0;

  for (var i = 0; i < str.length; i++) {
    sum += parseInt(str.charAt(i), 10);
  }

  return sum;
}