以下是软件版本号:

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

以下是您可以直接使用的实现代码(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.mapArray.every,这意味着它不会在9之前的IE版本中运行.如果您需要支持这些方法,则必须为缺少的方法提供多边形填充.

Javascript相关问答推荐

构造函数作为对象键

如何判断数组是否包含给定元素

过滤递归数组

当一次按下超过 2 个键时,p5.js keyIsDown() 行为不一致

React 18,useEffect 被调用了两次

为什么我的 React.useEffect() 中有太多的重新渲染?

EcmaScript 规范中 classScope 的目的是什么?

Spread Syntax 创建浅拷贝还是深拷贝?

如何在不重新渲染未删除的项目的情况下从列表中删除项目?

切换暗模式 - 新创建元素的问题

javascript中的第n个子选择器

如何将对象键设置为公分母?

如何让 Javascript 跟踪我的分数增量?

使用 JavaScript/React 过滤 API 响应

为什么这个二维数组过滤不起作用?

使用 useState 挂钩更新对象数组

无法访问存储在 vue.js 中本地存储 [object Object] 中的 json 对象

str.replace(/^/gm, "\t") 的预期行为是什么

我该如何解决这个错误:FirebaseError: Expected type 'mc', but it was: a custom yc object?

如何将 DRACO 加载器与 GLTF 加载器一起使用?