【问题标题】:Get array of latest minor versions from array从数组中获取最新的次要版本数组
【发布时间】:2021-04-25 09:57:33
【问题描述】:

我有这个 semver 版本数组:

let versions = ['4.5.0', '4.5.1', '4.5.2', '4.6.0', '4.6.1', '4.6.2', '4.7.0', '4.7.1', '4.8.0', '4.8.1']

我想过滤这个数组,只保留基于次要和主要版本的最新补丁版本。

预期结果:

['4.5.2', '4.6.2', '4.7.1', '4.8.1']

我尝试在比较主要和次要版本的两个循环中检查每个版本,但每次我在最终数组中都有重复版本和较低版本。


我的代码:

for (let versions of supportedReleaseList) {
  for (let doubleCheckVersion of supportedReleaseList) {
    if (semver.parse(versions).major === semver.parse(doubleCheckVersion).major) {
      if (semver.parse(versions).minor === semver.parse(doubleCheckVersion).minor) {
        if (semver.parse(versions).patch > semver.parse(doubleCheckVersion).patch) {
           finalList.push(versions);
        }
      }
    }
  }
}

结果是:

['4.5.1', '4.5.2', '4.5.2', '4.6.1', '4.6.2', '4.6.2', '4.7.1', '4.8.1']

【问题讨论】:

  • 列表排序了吗?

标签: javascript arrays semantic-versioning


【解决方案1】:

我会做这样的事情。无论输入列表是否有序,它都会起作用:

const semver = require('semver');

const versions = [
  '4.5.0', '4.5.1', '4.5.2',
  '4.6.0', '4.6.1', '4.6.2',
  '4.7.0', '4.7.1',
  '4.8.0', '4.8.1'
];

const latestMinorVersions = new Map();

for ( const v of versions.map( semver.parse ) ) {
    const baseVersion = new semver.SemVer(`${v.major}.${v.minor}.0`).toString();

    if ( !latestMinorVersions.has( baseVersion ) ) {
        latestMinorVersions.set( baseVersion, v );
    }

    const maxVersion = latestMinorVersions.get( baseVersion );
    const cc         = maxVersion.compare( v );
    if ( cc < 0 ) {
        latestMinorVersions.set(baseVersion, v);
    }

}

console.log(Array.from(latestMinorVersions.values()).map(v => v.toString()));

它产生所需的['4.5.2', '4.6.2', '4.7.1', '4.8.1']

请注意如果您的 versions 数组包含预发布和/或构建元数据,例如 1.2.3-beta1.2.3+4561.2.3.beta+456,则此可能不起作用正如预期的那样:我建议测试这些边缘情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 2017-05-02
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多