Javascript 第二类“;数字”;多点
我有一个无序的列表,看起来像这样:Javascript 第二类“;数字”;多点,javascript,sorting,numerical,Javascript,Sorting,Numerical,我有一个无序的列表,看起来像这样: 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 我需要哪种排序功能?以下是适用于我的代码: var arr = [ '1.2.2', '1.1.1',
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
我需要哪种排序功能?以下是适用于我的代码:
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;
}
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(函数(a,b){
返回版本比较(a、b);
});
控制台日志(arr);
功能版本比较(v1、v2、选项){
var lexicographical=options&&options.lexicographical,
zeroExtend=options&&options.zeroExtend,
v1parts=v1.split('.'),
v2parts=v2.split('.');
函数isValidPart(x){
返回(词典?/^\d+[A-Za-z]*$/:/^\d+$/).test(x);
}
如果(!v1parts.every(isValidPart)| |!v2parts.every(isValidPart)){
返回NaN;
}
如果(零扩展){
而(v1parts.lengthv2parts[i]){
返回1;
}
否则{
返回-1;
}
}
如果(v1parts.length!=v2parts.length){
返回-1;
}
返回0;
}
签出(查看javascript文件并打开控制台) 您可以尝试:
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()
Array.prototype.sortVersions=function(){
返回此.map(函数(e){
返回e.split('.').map(函数(e){
返回parseInt(e)
}
)}).排序(功能(a、b){
对于(var i=0;i
也许有帮助。“我需要哪个排序函数?”--这真的不是一个好问题,更像是“你能给我做一个排序函数吗?”。我们希望看到一些代码,您尝试了什么,出了什么问题,您是如何调试代码的,等等。请查看此处的cmpVersion
函数:通过查看您的预期输出,我无法理解您希望结果的顺序。你能再解释一下吗?迈克,他想把它们按版本号排序