JS中的罗马和阿拉伯数字字符串数组排序

时间:2019-03-19 10:27:07

标签: javascript arrays sorting

我的数组包含阿拉伯数字和罗马数字作为字符串的列表。我想按罗马数字升序对它们进行排序,然后按照阿拉伯数字按升序排列。 我写下面的代码,

412 Precondition Failed

但是结果是, 结果:var myarray = ["i", "ii", "iii", "xv", "x", "1", "2", "3", "5", "601", "vi", "vii", "88", "99", "201", "101", "xix", "125", "iv", "vi", "v", "xiv", "58"] myarray.sort(function (a, b) { try { if (Number(a) != null) a = Number(a); if (Number(b) != null) b = Number(b); } catch (e) {} if (a > b) { return 1; } if (b > a) { return -1; } if (a == b) { return a.position - b.position; } }); console.log(myarray); 如果我没有将字符串转换为数字, 结果:ii,iii,xv,x,1,2,3,5,v,vi,vii,vi,iv,xix,xiv,58,88,99,101,125,201,601,i 我的预期结果应该是 结果:1,101,125,2,201,3,5,58,601,88,99,i,ii,iii,iv,v,vi,vi,vii,x,xiv,xix,xv

1 个答案:

答案 0 :(得分:0)

这里有很多东西:

  • 您不需要try / catch块。随便吧。
  • 检查解析的数字是否为null不会给您预期的结果。您需要检查NaN。
  • 将两个值解析为一个数字或不解析为两个。否则,您将无法正确比较。
  • 通常,数字将在字符串之前返回。为避免这种情况,如果一个值是数字而一个值是字符串,则需要通过乘以-1来反转结果值。

这是sort方法的有效版本:

var myarray = ["i", "ii", "iii", "xv", "x", "1", "2", "3", "5", "601", "vi", "vii", "88", "99", "201", "101", "xix", "125", "iv", "vi", "v", "xiv", "58"]
myarray.sort(function (a, b) {
  if (!isNaN(Number(a)) && !isNaN(Number(b))) {
    a = Number(a);
    b = Number(b);
  }
  var result;
  if (a > b) {
    result = 1;
  }
  if (b > a) {
    result = -1;
  }
  if (a == b) {
    result = a.position - b.position;
  }
  if (isNaN(Number(a)) !== isNaN(Number(b))) {
    result = result * -1;
  }
  return result;
});
console.log(myarray);