当前位置: 首页 > 面试题库 >

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

轩辕华辉
2023-03-14
问题内容

这是软件版本号:

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



 类似资料:
  • 软件包的版本号是个奇怪的东西。它们看起来像十进制的数字,但它们不是。 例如,一个版本号通常的形式为 2.6.4。如果你需要比较两个版本号, 不能做简单的字符串比较,因为 2.6.4 会比 2.6.12 大;也不能进行数字比较, 因为它们不是有效地数字。 Puppet 的 versioncmp 函数会帮我们解决这个问题。 若你给它传递两个版本号,它会比较它们,并返回一个值,指出谁是更大的: ve

  • 问题内容: 我正在走一个包含鸡蛋的目录,将这些鸡蛋添加到sys.path。如果目录中有相同.egg的两个版本,我只想添加最新的一个。 我有一个正则表达式·可以从文件名中提取名称和版本。问题是比较版本号,它是一个类似的字符串2.3.1。 由于我在比较字符串,所以2在10之上排序,但这对于版本是不正确的。 我可以进行一些拆分,解析,转换为int等操作,最终得到解决方法。但这是Python,而不是Jav

  • 我正在浏览一个包含鸡蛋的目录,以将这些鸡蛋添加到。如果目录中有同一个.egg的两个版本,我只想添加最新版本。 我有一个正则表达式

  • 问题内容: 我想写一个样功能,比较两个版本号,并返回,或根据自己的比较valuses。 如果版本A早于版本B,则返回 返回如果版本A和B是等价的 如果版本A比版本B更新,则返回 每个小节都应解释为一个数字,因此1.10> 1.1。 所需的功能输出为 这是我的实现,有待改进: 我正在使用Python 2.4.5 btw。(安装在我的工作地点…)。 这是您可以使用的小型“测试套件” 问题答案: 删除字

  • 问题内容: 我有两个字符串(它们实际上是版本号,它们可以是任何版本号) 我想比较哪个更大。在golang中如何做? 问题答案: 将“ 1.05.00.0156”转换为“ 0001” +“ 0005” +“ 0000” +“ 0156”,然后转换为int64。 将“ 1.0.221.9289”转换为“ 0001” +“ 0000” +“ 0221” +“ 9289”,然后转换为int64。 比较两个

  • 软件版本号对照表 软件名称 版本 Red Hat JBoss Data Virtualization 6.3.0 + Patches Red Hat JBoss Developer Studio 10.4.0 Red Hat JBoss Enterprise Application Platform 6.4.0