比较两个版本号的大小
@param
version1
第一个版本号,格式为 "主版本号-标签",例如 "1.2.3-alpha
"@param
version2
第二个版本号,格式为 "主版本号-标签",例如 "1.2.4-beta
"@returns 如果
version1
小于version2,返回
-1;如果version1
大于version2
,返回 1;如果两者相等,返回 0
import { Versions } from 'func-package';// 你可以在这里添加一些调用示例来演示函数的使用console.log(Versions("1.0.0", "2.0.0")); // 应该输出 -1console.log(Versions("1.2.3-beta", "1.2.3-alpha")); // 应该输出 1console.log(Versions("1.0.0", "1.0.0-rc")); // 应该输出 -1
const Versions = (version1: string, version2: string): number => {// 分别提取主版本号和标签// 分别提取主版本号和标签const [mainVer1, tag1] = version1.split(/-(.+)/).map((s) => s.trim());const [mainVer2, tag2] = version2.split(/-(.+)/).map((s) => s.trim());// 比较主版本号// 比较主版本号let arr1: number[] = mainVer1.split(".").map(Number);let arr2: number[] = mainVer2.split(".").map(Number);for (let i = 0; i < Math.max(arr1.length, arr2.length); i++) {let num1 = arr1[i] || 0;let num2 = arr2[i] || 0;if (num1 < num2) {return -1;} else if (num1 > num2) {return 1;}}// 如果主版本号相同,则比较标签(如果有)// 如果主版本号相同,则比较标签(如果有)if (tag1 && tag2) {// 简单假设标签只是数字,实际情况可能更复杂,可能需要更详细的解析逻辑// 简单假设标签只是数字,将非数字字符替换为空字符串,然后转换为整数const tagNum1 = parseInt(tag1.replace(/\D/g, ""), 10) || 0; // 移除非数字字符,转换为整数const tagNum2 = parseInt(tag2.replace(/\D/g, ""), 10) || 0;if (tagNum1 < tagNum2) {return -1;} else if (tagNum1 > tagNum2) {return 1;}} else if (tag1) {// 有标签的版本应视为小于无标签的版本// 如果version1有标签而version2没有,则返回-1return -1;} else if (tag2) {// 如果version2有标签而version1没有,则返回1return 1;}// 主版本号和标签都相同// 如果主版本号和标签都相同,则返回0return 0;};