Javascript 简化semver版本比较逻辑
这里有标准的npm semver版本比较库,但我有一些简单的逻辑来比较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
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。(或者,最好使用数组方法来查找第一个不同的零件)