我有一个无序列表,看起来像这样:
1.1.1
1.1.1.1
1.1.2
1.10.1
1.10.2
1.2.1
1.2.2
1.2.3
1.2.4
1.20.1
1.3.1
我希望在Javascript中将其排序为“数字”顺序。
1.1.1
1.1.1.1
1.1.2
1.2.1
1.2.2
1.2.3
1.2.4
1.3.1
1.10.1
1.10.2
1.20.1
我需要哪种排序功能?
答案 0 :(得分:6)
您可以尝试:
Array.prototype.sortVersions = function() {
return this.map(function(e) {
return e.split('.').map(function(e) {
return parseInt(e)
}
)}).sort(function(a,b) {
for (var i = 0; i < Math.max(a.length, b.length); i++) {
if (!a[i]) return -1;
if (!b[i]) return 1;
if (a[i]-b[i] != 0) return a[i]-b[i];
}
return 0;
}).map(function(e) {
return e.join('.')
});
}
['1.1.1','1.1.1.1','1.1.2','1.10.1','1.10.2','1.2.1','1.2.2','1.2.3','1.2.4','1.20.1','1.3.1'].sortVersions()
答案 1 :(得分:0)
以下是适用于我的代码:
var arr = [
'1.2.2',
'1.1.1',
'1.1.1.1',
'1.1.2',
'1.10.1',
'1.10.2',
'1.2.1',
'1.2.2',
'1.2.3',
'1.2.4',
'1.20.1',
'1.3.1'];
arr.sort(function(a, b) {
return versionCompare(a, b);
});
console.log(arr);
function versionCompare(v1, v2, options) {
var lexicographical = options && options.lexicographical,
zeroExtend = options && options.zeroExtend,
v1parts = v1.split('.'),
v2parts = v2.split('.');
function isValidPart(x) {
return (lexicographical ? /^\d+[A-Za-z]*$/ : /^\d+$/).test(x);
}
if (!v1parts.every(isValidPart) || !v2parts.every(isValidPart)) {
return NaN;
}
if (zeroExtend) {
while (v1parts.length < v2parts.length) v1parts.push("0");
while (v2parts.length < v1parts.length) v2parts.push("0");
}
if (!lexicographical) {
v1parts = v1parts.map(Number);
v2parts = v2parts.map(Number);
}
for (var i = 0; i < v1parts.length; ++i) {
if (v2parts.length == i) {
return 1;
}
if (v1parts[i] == v2parts[i]) {
continue;
}
else if (v1parts[i] > v2parts[i]) {
return 1;
}
else {
return -1;
}
}
if (v1parts.length != v2parts.length) {
return -1;
}
return 0;
}
查看my plunker(查看javascript文件并打开控制台)。 Via