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

11 浏览
0 Comments

如何使用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日
0
0 Comments

进行此比较的基本思想是使用Array.split从输入字符串中获取部分数组,然后比较来自两个数组的部分对; 如果这些部分不相等,则知道哪个版本较小。

需要记住一些重要细节:

  1. 每个对中的部分应如何进行比较?问题想要进行数字比较,但如果我们有不仅仅由数字组成的版本字符串(例如“1.0a”)会怎样?
  2. 如果一个版本字符串比另一个版本字符串具有更多部分,会发生什么?最有可能的是“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.mapArray.every,这意味着它将无法运行在早于9的IE版本中。如果需要支持它们,您必须为缺少的方法提供polyfills。

0
0 Comments

semver

语义化版本分析器,被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

0