从数组中获取最新次要版本的数组

Get array of latest minor versions from array

我有这个 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']

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

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 数组包含预发布 and/or 构建元数据,例如 1.2.3-beta1.2.3+4561.2.3.beta+456,这 可能 无法按预期工作:我建议测试那些边缘情况。