博客 / 詳情

返回

前端對比版本號

版本號規範

參考https://semver.org/lang/zh-CN/

1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0 < 2.0.0 < 2.1.0 < 2.1.1

具體實現

function compareVersion(v1, v2) {
  function* getStepVersion(v) {
    const matchReg = /(\.|\-)/; // 匹配到任意一項,則返回分段的版本號
    // 將先行版本號,轉換成數字,直接比大小
    const specialVersionTransObj = {
      alpha: -3,
      beta: -2,
      rc: -1,
    };
    let tmp = ""; // 存儲每段版本的值
    for (let i = 0; i <= v.length - 1; i++) {
      let item = v[i];
      if (matchReg.test(item)) {
        yield specialVersionTransObj[tmp] || tmp;
        tmp = "";
      } else {
        tmp += item;
      }
    }

    // 遍歷至最後一項,沒有匹配到.-也要返回結果
    if (tmp) {
      yield specialVersionTransObj[tmp] || tmp;
    }
  }

  const v1Iterator = getStepVersion(v1);
  const v2Iterator = getStepVersion(v2);

  let isEnd = false;
  let isHighLevel = false;
    // 每次遍歷相當於,2個版本號分段間的比較
  while (!isEnd) {
    const item1 = v1Iterator.next();
    const item2 = v2Iterator.next();
    item1.value = item1.value || 0;
    item2.value = item2.value || 0;
    
    if (item1.done && item2.done) {
        // 代表版本號一致
      isEnd = true;
    } else {
      if (Number(item2.value) > Number(item1.value)) {
        // v2 版本大於 v1
        isHighLevel = true;
        isEnd = true;
      } else if (Number(item2.value) < Number(item1.value)) {
        // v2 版本小於 v1
        isHighLevel = false;
        isEnd = true;
      }
    }
  }
  return isHighLevel;
}

單元測試

compareVersion("2.3.4", "1.3.4"); // false
compareVersion("2.3.4", "1.4.4"); // false
compareVersion("2.3.4", "2.3.4.alpha"); // false
compareVersion("2.3.4.alpha-1", "2.3.4.alpha-2"); // true
compareVersion("2.3.4.alpha-2", "2.3.4.beta"); // true
compareVersion("2.3.4.alpha", "1..4.alpha"); // false
compareVersion("2.3.4.alpha", "2.3.4.alpha"); // false
compareVersion("2.3.4.alpha", "3.3.4.alpha"); // true
compareVersion("2.3.4.alpha", "2.2.4.alpha"); // false
compareVersion("2.3.4.alpha", "2.4.4.alpha"); // true
compareVersion("2.3.4.alpha", "2.4.4.alpha"); // true
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.