如何使用js比较软件版本号?(仅数字)

这是软件版本号:

"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"

这个想法很简单…:先读取第一个数字,然后读取第二个,然后读取第三个数字…。但是我无法将版本号转换为浮点数…。您还可以看到类似的版本号这个:

"1.0.0.0", "1.0.1.0", "2.0.0.0", "2.0.0.1", "2.0.1.0"

而且更清楚地看到背后的想法是什么…但是,如何将其转换为计算机程序?有人对如何排序有任何想法吗?谢谢。

回答:

进行比较的基本思想是使用Array.split从输入字符串中获取零件的数组,然后比较两个数组中的零件对。如果零件不相等,我们知道哪个版本较小。

需要牢记一些重要的细节:

  1. 每对中的部分应该如何比较?这个问题想进行数字比较,但是如果我们有不是仅由数字组成的版本字符串(例如“ 1.0a”)怎么办?
  2. 如果一个版本字符串比其他版本字符串包含更多部分,应该怎么办?应该最有可能将“ 1.0”视为小于“ 1.0.1”,但是“ 1.0.0”呢?

这是您可以直接使用的实现代码(带有文档的要点):

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;

}

该版本自然比较部分,不接受字符后缀,并认为“ 1.7”小于“

1.7.0”。比较模式可以更改为词典编排,较短的版本字符串可以使用可选的第三个参数自动补零。

它是ripper234的作品的略微扩展版本(谢谢)。

此代码使用Array.mapArray.every,这意味着它将无法在9之前的IE版本中运行。如果需要支持这些代码,则必须为缺少的方法提供polyfill。

以上是 如何使用js比较软件版本号?(仅数字) 的全部内容, 来源链接: utcz.com/qa/430207.html

回到顶部