题目描述

Semantic Versioning 是一个前端通用的版本规范。格式为“{MAJOR}.{MINOR}.{PATCH}-{alpha|beta|rc}.{number}”,要求实现 compare(a, b) 方法,比较 a, b 两个版本大小
1. 当 a > b 是返回 1;
2. 当 a = b 是返回 0;
3. 当 a < b 是返回 -1;
4. 其中,rc > beta > alpha,major > minor > patch;
5. 例子,1.2.3 < 1.2.4 < 1.3.0-alpha.1 < 1.3.0-alpha.2 < 1.3.0-beta.1 < 1.3.0-rc.1 < 1.3.0

题解

  1. const tempArr = ['1.3.0-rc', '1.3.0-beta.1','1.3.0', '1.2.3', '1.3.0-rc.1','1.3.0-alpha.2', '1.2.13', '1.3.0-alpha.1' ];
  2. function compareVersion(v1, v2) {
  3. const versionReg = /(\d+)\.(\d+)\.(\d+)(-(alpha|beta|rc)(\.(\d+))?)?/;
  4. const regIndex = [1, 2, 3, 5, 7]; // major minor patch stage stageNum
  5. const v1Result = versionReg.exec(v1);
  6. const v2Result = versionReg.exec(v2);
  7. let res = 0;
  8. regIndex.find(index => {
  9. let diff;
  10. if(index !== 5) {
  11. diff = (v1Result[index] ?? 0) - (v2Result[index] ?? 0);
  12. } else {
  13. diff = (v1Result[index]?.[0] ?? 'z').charCodeAt() - (v2Result[index]?.[0] ?? 'z').charCodeAt();
  14. }
  15. if(diff) {
  16. res = diff > 0 ? 1 : -1;
  17. return true;
  18. }
  19. })
  20. return res;
  21. }
  22. console.log(tempArr.sort(compareVersion).join(' < '));