小编典典

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

all

这是软件版本号:

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

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


阅读 62

收藏
2022-06-06

共1个答案

小编典典

进行这种比较的基本思想是使用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”。比较模式可以更改为字典式,更短的版本字符串可以使用可选的第三个参数自动补零。

这里有一个运行“单元测试”的JSFiddle;它是ripper234
作品
的略微扩展版本(谢谢)。

重要提示: 此代码使用Array.mapand
Array.every,这意味着它不会在早于 9 的 IE
版本中运行。如果您需要支持这些,则必须为缺少的方法提供 polyfill。

2022-06-06