>假设我有一个这样的数组:
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#localeCompare
与options
一起使用
敏感性
字符串中的哪些差异应导致非零结果值。可能的值为:
用法">
"base"
:只有基本字母不同的字符串才算不相等。示例:a ≠ b
、a = á
、a = A
。"accent"
:只有基本字母或重音符号和其他变音符号不同的字符串才算不相等。示例:a ≠ b
、a ≠ á
、a = A
。"case"
:只有基本字母或大小写不同的字符串才算作不相等。示例:a ≠ b
、a = á
、a ≠ A
。"variant"
:基本字母、重音符号和其他变音符号或大小写不同的字符串比较为不相等。还可以考虑其他差异。示例:a ≠ b
、a ≠ á
、a ≠ A
。sort"的默认值为"variant";它依赖于用法"搜索"的区域设置。
数值的
是否应使用数字排序规则,以便"1"<"2"<"10"。可能的值为
true
和false
;默认值为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);
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
符号排序正确- 使用本机
localeCompare
对1.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))]);