首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简化版本比较逻辑

简化版本比较逻辑
EN

Stack Overflow用户
提问于 2019-04-02 10:52:34
回答 2查看 1.4K关注 0票数 3

有标准的npm semver版本比较库,但我在这里有一些简单的逻辑来比较semver版本:

代码语言:javascript
复制
const versionA = '14.8.3';
const versionB = '15.1.1';
const versionC = '15.1.2';

const semver = require('semver');
const assert = require('assert');

const isGreater = (a, b) => {

  const [majorA, minorA, patchA] = String(a).split('.').map(v => Number.parseInt(v));
  const [majorB, minorB, patchB] = String(b).split('.').map(v => Number.parseInt(v));


  if (majorA > majorB) {
    return true;
  }

  if (majorB > minorA) {
    return false;
  }

  if (minorA > minorB) {
    return true;
  }

  if (minorB > minorA) {
    return false;
  }

  if (patchA > patchB) {
    return true;
  }

  if (patchB > patchA) {
    return false;
  }

  return false;

};


assert(isGreater(versionB, versionA), 'version b should be greater.');
assert(isGreater(versionA, versionB), 'version b should be greater.');

我的问题是-有没有一种方法可以简化greaterThan函数中的逻辑?此函数用于复制semver.gt()中的逻辑。

EN

回答 2

Stack Overflow用户

发布于 2019-04-02 10:57:20

您可以使用带有numeric选项的localeCompare (对于numeric,比较结果是"1“< "2”< "10"),这正是您要查找的逻辑:

代码语言:javascript
复制
const versionA = '14.8.3';
const versionB = '15.1.1';
const versionC = '15.1.2';
const versionD = '15.1.10';
const versionE = '15.2.1';
const versionF = '15.11.1';

const isGreater = (a, b) => {
  return a.localeCompare(b, undefined, { numeric: true }) === 1;
};

// first argument version comes later than second argument:
console.log(isGreater(versionB, versionA));
console.log(isGreater(versionC, versionB));
console.log(isGreater(versionD, versionC));
console.log(isGreater(versionE, versionD));
console.log(isGreater(versionF, versionE));

console.log('---');

// second comes before first:
console.log(isGreater(versionA, versionB));

// same, return value should be false:
console.log(isGreater(versionA, versionA));

或者,等效地,您可以传递区域设置字符串

代码语言:javascript
复制
en-US-u-kn-true

作为第二个参数,而不是{ numeric: true }

票数 11
EN

Stack Overflow用户

发布于 2019-04-02 10:59:21

我相信这在逻辑上是相同的,而且更短,但它的简单性并不完全令人惊讶

代码语言:javascript
复制
const isGreater = (a, b) => {

  const [majorA, minorA, patchA] = String(a).split('.').map(v => Number.parseInt(v));
  const [majorB, minorB, patchB] = String(b).split('.').map(v => Number.parseInt(v));

  if (majorA !== majorB) {
    return majorA > majorB;
  }

  if (minorA !== minorB) {
    return minorA > minorB;
  }

  return patchA > patchB;

};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55466274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档