如何使用JavaScript比较软件版本号?(仅数字)
如何使用JavaScript比较软件版本号?(仅数字)
这里是软件版本号:
"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"
这更清楚地看出背后的想法...
但是,我该如何将它转换为计算机程序?
admin 更改状态以发布 2023年5月21日
进行此比较的基本思想是使用Array.split
从输入字符串中获取部分数组,然后比较来自两个数组的部分对; 如果这些部分不相等,则知道哪个版本较小。
需要记住一些重要细节:
- 每个对中的部分应如何进行比较?问题想要进行数字比较,但如果我们有不仅仅由数字组成的版本字符串(例如“1.0a”)会怎样?
- 如果一个版本字符串比另一个版本字符串具有更多部分,会发生什么?最有可能的是“1.0”应该被认为比“1.0.1”小,但是“1.0.0”呢?
下面是一个可直接使用的实现代码(带有文档的gist):
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”。比较模式可以更改为按字典顺序,可以使用可选的第三个参数自动填充长度较短的版本字符串。
在这里运行“单元测试”的JSFiddle链接;这是ripper234
的稍微扩展版本(谢谢)。
重要提示:此代码使用Array.map
和Array.every
,这意味着它将无法运行在早于9的IE版本中。如果需要支持它们,您必须为缺少的方法提供polyfills。
语义化版本分析器,被npm使用。
$ npm install semver
var semver = require('semver'); semver.diff('3.4.5', '4.3.7') //'major' semver.diff('3.4.5', '3.3.7') //'minor' semver.gte('3.4.8', '3.4.7') //true semver.ltr('3.4.8', '3.4.7') //false semver.valid('1.2.3') // '1.2.3' semver.valid('a.b.c') // null semver.clean(' =v1.2.3 ') // '1.2.3' semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true semver.gt('1.2.3', '9.8.7') // false semver.lt('1.2.3', '9.8.7') // true var versions = [ '1.2.3', '3.4.5', '1.0.2' ] var max = versions.sort(semver.rcompare)[0] var min = versions.sort(semver.compare)[0] var max = semver.maxSatisfying(versions, '*')
语义化版本链接:
https://www.npmjs.com/package/semver#prerelease-identifiers