Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 简化semver版本比较逻辑_Javascript_Node.js_Semantic Versioning - Fatal编程技术网

Javascript 简化semver版本比较逻辑

Javascript 简化semver版本比较逻辑,javascript,node.js,semantic-versioning,Javascript,Node.js,Semantic Versioning,这里有标准的npm semver版本比较库,但我有一些简单的逻辑来比较semver版本: 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, min

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

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()中的逻辑。

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

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';
常量大于=(a,b)=>{
返回a.localeCompare(b,未定义,{numeric:true})==1;
};
//第一个参数版本晚于第二个参数版本:
log(更大版本(versionB,versionA));
log(更大的版本(versionC,versionB));
log(更大(versionD,versionC));
log(更大(versionE,versionD));
log(更大版本(versionF,versionE));
console.log('--');
//二先于一:
log(更大(versionA,versionB));
//相同,返回值应为false:

log(更大(versionA,versionA))我相信这在逻辑上是相同的,而且更短,但它的简单性并不令人震惊

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;

};

{numeric:true})==-1?false:true
应该是
{numeric:true})==1?true:false
对于
更大
。。。您的函数现在所做的是
isgreaterrequal
您可以通过
简化一点。map(Number)
(和
a
b
已经是字符串,因此如果您不想,无需再次强制转换它们)。您可以将差异与
| |
进行比较以简化:
(majorA-majorB)| |(minorA-minorB)| |(patchA-patchB)
,这将导致第一个a零件的正数大于B。(或者,最好使用数组方法来查找第一个不同的零件)