对存储在数组中作为字符串的版本号进行排序



>假设我有一个这样的数组:

let arr = ["1.2.5", "1", "10", "2.0.4", "3.3.3.3"];

对此进行排序并获得以下结果的最佳方法是什么:
let arr = ["1", "1.2.5", "2.0.4", "3.3.3.3", "10"];

首先,我想将数组中的每个项目转换为"float"可能会起作用,但随后多个小数不会给出预期的结果。

我也可以进行for循环,做一些像item.split(".")这样的事情,然后一个接一个地检查,但我认为这不是最好的方法。

有什么建议吗?

您可以将String#localeCompareoptions一起使用

敏感性

字符串中的哪些差异应导致非零结果值。可能的值为:

  • "base":只有基本字母不同的字符串才算不相等。示例:a ≠ ba = áa = A
  • "accent":只有基本字母或重音符号和其他变音符号不同的字符串才算不相等。示例:a ≠ ba ≠ áa = A
  • "case":只有基本字母或大小写不同的字符串才算作不相等。示例:a ≠ ba = áa ≠ A
  • "variant":基本字母、重音符号和其他变音符号或大小写不同的字符串比较为不相等。还可以考虑其他差异。示例:a ≠ ba ≠ áa ≠ A
用法">

sort"的默认值为"variant";它依赖于用法"搜索"的区域设置。

数值的

是否应使用数字排序规则,以便"1"<"2"<"10"。可能的值为truefalse;默认值为false。可以通过选项属性或通过 Unicode 扩展键设置此选项;如果两者都提供,则options属性优先。不需要实现来支持此属性。

var array = ["1.2.5", "1", "10", "2.0.4", "3.3.3.3"];
array.sort(function (a,b) {
return a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' });
});
console.log(array);

function compare(a, b) {
var aSplit = a.split(".");
var bSplit = b.split(".");

var length = Math.min(aSplit.length, bSplit.length);
for (var i = 0; i < length; ++i) {
if (parseInt(aSplit[i]) < parseInt(bSplit[i])) {
return -1;
} else if (parseInt(aSplit[i]) > parseInt(bSplit[i])) {
return 1;
}
}
if (aSplit.length < bSplit.length) {
return -1;
} else if (aSplit.length > bSplit.length) {
return 1;
}
return 0;
}

你可以这样使用它:arr.sort((a, b( => compare(a, b((;

这是我的解决方案(使用 ES6 语法(

const arr = ["1.2.5", "1", "10", "2.0.4", "3.3.3.3"];
const result = arr
.map((n) => n.split('.').map((c) => c.padStart(10, '0')).join('.'))
.sort()
.map((n) => n.split('.').map((c) => +c).join('.'))
console.log(result);

var arr = ["1.2.5", "1", ">

10", "2.0.4", "3.3.3.3"];

var arr = ["1.2.5", "1", "10", "2.0.4", "3.3.3.3"];
console.log(arr.sort(function(a,b){
var arr1 = a.split('.');
var arr2 = b.split('.');

var maxlen = Math.max(arr1.length,arr2.length);

var i;
for(i = 0;i<maxlen;i++){
		var i1 = parseInt(arr1[i] || 0)
var i2 = parseInt(arr2[i] || 0)
			if(i1 < i2){
			return -1;
}
else if(i1 > i2){
			return 1;
}
}

return 0;
}));

  • 1.0a符号排序正确
  • 使用本机localeCompare1.090表示法进行排序

function log(label,val){
document.body.append(label,String(val).replace(/,/g," - "),document.createElement("BR"));
}
const sortVersions = (
x,
v = s => s.match(/[a-z]|d+/g).map(c => c==~~c ? String.fromCharCode(97 + c) : c)
) => x.sort((a, b) => (a + b).match(/[a-z]/) 
? v(b) < v(a) ? 1 : -1 
: a.localeCompare(b, 0, {numeric: true}))
let v=["1.90.1","1.090","1.0a","1.0.1","1.0.0a","1.0.0b","1.0.0.1","1.0a"];
log(' input : ',v);
log('sorted: ',sortVersions(v));
log('no dups:',[...new Set(sortVersions(v))]);

最新更新