以下是软件版本号:
"1.0", "1.0.1", "2.0", "2.0.0.1", "2.0.1"
我该怎么比较呢??
"1.0", "1.0.1", "2.0", "2.0.0.1", "2.0.1"
idea 很简单…:
"1.0.0.0", "1.0.1.0", "2.0.0.0", "2.0.0.1", "2.0.1.0"
这更清楚地看到了背后的 idea ...
以下是软件版本号:
"1.0", "1.0.1", "2.0", "2.0.0.1", "2.0.1"
我该怎么比较呢??
"1.0", "1.0.1", "2.0", "2.0.0.1", "2.0.1"
idea 很简单…:
"1.0.0.0", "1.0.1.0", "2.0.0.0", "2.0.0.1", "2.0.1.0"
这更清楚地看到了背后的 idea ...
进行这种比较的基本思想是使用Array.split
从输入字符串中获取部分数组,然后比较两个数组中的部分对;如果零件不相等,我们知道哪个版本更小.
有几个重要的细节需要记住:
以下是您可以直接使用的实现代码(gist with documentation):
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;
}
该版本比较第naturally部分,不接受字符后缀,并认为"1.7"小于"1.7.0".比较模式可以更改为字典式,较短版本的字符串可以使用可选的第三个参数自动进行零填充.
有一个JSFIDLE运行"单元测试"here;这是ripper234's work的一个稍微扩展的版本(谢谢).
Important note:此代码使用Array.map
和Array.every
,这意味着它不会在9之前的IE版本中运行.如果您需要支持这些方法,则必须为缺少的方法提供多边形填充.