【问题标题】:sorting array with decimal value in specific order using javascript使用javascript以特定顺序对具有十进制值的数组进行排序
【发布时间】:2019-05-14 20:10:33
【问题描述】:

我有一个数组:

let arr = ['100.12', '100.8', '100.11', '100.9'];

排序后得到输出:

'100.11',
'100.12',
'100.8',
'100.9',

但我希望它像页面索引一样排序:

'100.8',
'100.9',
'100.11',
'100.12',

编辑: 我几乎没有什么好的解决方案,但它们缺少一个地方,例如: arr1 = ['100.12', '77.8', '88', '77.11', '77.12', '77.9', '77', '119', '120', '100.8', '100.11', '100', '100.9']

结果会是这样的:

["77.8", "77.9", "77.11", "77.12", "77", "88", "100.8", "100.11", "100.12", "100", "100.9", "119", "120"]

这里预计是:

[ "77", "77.8", "77.9", "77.11", "77.12", "88", "100", "100.8", "100.11", "100.12", "100.9", "119", "120"]

【问题讨论】:

  • 我尝试过像这样的排序:arr.sort(function (a, b) { return Number(a ) - Number(b); });
  • 例如:arr1 = ['100.12', '77.8', '88', '77.11', '77.12', '77.9', '77', '119', '120', ' 100.8', '100.11', '100', '100.9'] 结果如下: ["77.8", "77.9", "77.11", "77.12", "77", "88", "100.8", " 100.11"、"100.12"、"100"、"100.9"、"119"、"120"] 这里预期为:["77"、"77.8"、"77.9"、"77.11"、"77.12"、"88" ”、“100”、“100.8”、“100.11”、“100.12”、“100.9”、“119”、“120”]

标签: javascript arrays typescript sorting


【解决方案1】:

不是简单的oneliner。你想先按整数部分排序,如果相等,再按小数部分。

const arr =  ['100.12', '77.8', '88', '77.11', '77.12', '77.9', '77', '119', '120', '100.8', '100.11', '100', '100.9'];
const sorted = arr.sort((a, b) => {
      if (parseInt(a) !== parseInt(b)) {
        return parseInt(a) - parseInt(b);
      }
      return (parseInt(a.split('.')[1], 10) || 0) - (parseInt(b.split('.')[1], 10) || 0);
    });
    
console.log(sorted);

【讨论】:

  • 看看OP想要的结果。
  • 感谢@NirTzezana,已修复。
  • 这几乎就在那里,但它会导致问题,因为它们是这个数组中的一个整数,例如:arr1 = ['100.12', '77.8', '88', '77.11', '77.12' , '77.9', '77', '119', '120', '100.8', '100.11', '100', '100.9'] 结果会是:["77.8", "77.9", "77.11" ,“77.12”,“77”,“88”,“100.8”,“100.11”,“100.12”,“100”,“100.9”,“119”,“120”] 这里预期是:[“77”, “77.8”、“77.9”、“77.11”、“77.12”、“88”、“100”、“100.8”、“100.11”、“100.12”、“100.9”、“119”、“120”]跨度>
  • @sumitsharma 对此进行了调整,只是为了完整起见,即使您接受了其他答案:)
【解决方案2】:

您可以使用 string#localeComparenumeric 属性根据数值对数组进行排序。

let arr = ['100.12', '77.8', '88', '77.11', '77.12', '77.9', '77', '119', '120', '100.8', '100.11', '100', '100.9'];
arr.sort((a, b) => a.localeCompare(b, undefined, {numeric: true}))
console.log(arr)

【讨论】:

  • 这是awsm,非常感谢
  • 这不适用于更多的十进制值。如此,让Arr = ['100.123456','77 .84356','88 .12345','77 .112345','77 .125467','77.92345','77345.456','119.1234','120.345567','100.89876','100.11876','100.11876','100.11877354', '100.03245', '100.9'];
猜你喜欢
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 2013-04-03
  • 2015-09-11
  • 2019-11-04
相关资源
最近更新 更多