使用javascript以特定顺序对具有十进制值的数组进行排序

Posted

技术标签:

【中文标题】使用javascript以特定顺序对具有十进制值的数组进行排序【英文标题】:sorting array with decimal value in specific order using 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”] 【参考方案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'];

以上是关于使用javascript以特定顺序对具有十进制值的数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

一种循环冗余校验算法,它对具有特定非零值的尾随字节数不变

如何使用 jquery 或 javascript 计算具有特定值的行数?

如何对大量 csv 文件进行排序以按特定顺序读取它们?

如何创建获取请求以获取具有特定属性值的对象

Javascript如何将十进制数转换为具有特定小数位数的字符串

动态创建具有特定值的按钮数量以发挥作用