Skip to content

Commit 8fabc77

Browse files
committed
feat: enhance compareVersion function to support comparison operators
1 parent 01a094b commit 8fabc77

File tree

2 files changed

+71
-17
lines changed

2 files changed

+71
-17
lines changed

src/string/compareVersion.ts

Lines changed: 61 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,67 @@
1+
import type { ComparisonOperator } from '../types'
2+
13
/**
2-
* 比较两个版本字符串。
3-
*
4-
* @param {string} v1 - 第一个版本字符串。
5-
* @param {string} v2 - 第二个版本字符串。
6-
* @returns {number} - 如果 v1 大于 v2 返回 1,如果 v2 大于 v1 返回 -1,如果它们相等返回 0。
4+
* 比较两个版本号
5+
* @param {string} version1 - 第一个版本号
6+
* @param {string} version2 - 第二个版本号
7+
* @param {ComparisonOperator} [operator] - 比较操作符: '>', '<', '=', '>=', '<=', '!='
8+
* @returns {number|boolean} 如果提供操作符则返回布尔值,否则返回数字(-1, 0, 1)
79
*/
8-
export function compareVersion(v1: string, v2: string): number {
9-
const v1Arr = v1.split('.')
10-
const v2Arr = v2.split('.')
11-
const len = Math.max(v1Arr.length, v2Arr.length)
12-
for (let i = 0; i < len; i++) {
13-
const num1 = Number.parseInt(v1Arr[i] || '0')
14-
const num2 = Number.parseInt(v2Arr[i] || '0')
15-
if (num1 > num2) {
16-
return 1
10+
function compareVersion(version1: string, version2: string): number
11+
function compareVersion(
12+
version1: string,
13+
version2: string,
14+
operator: ComparisonOperator,
15+
): boolean
16+
function compareVersion(
17+
version1: string,
18+
version2: string,
19+
operator?: ComparisonOperator,
20+
): number | boolean {
21+
const v1Parts = version1.split('.').map(Number)
22+
const v2Parts = version2.split('.').map(Number)
23+
24+
const maxLength = Math.max(v1Parts.length, v2Parts.length)
25+
26+
// 补齐较短的版本号
27+
while (v1Parts.length < maxLength) v1Parts.push(0)
28+
while (v2Parts.length < maxLength) v2Parts.push(0)
29+
30+
// 逐位比较
31+
for (let i = 0; i < maxLength; i++) {
32+
if (v1Parts[i] > v2Parts[i]) {
33+
return operator ? handleOperator(1, operator) : 1
1734
}
18-
else if (num1 < num2) {
19-
return -1
35+
if (v1Parts[i] < v2Parts[i]) {
36+
return operator ? handleOperator(-1, operator) : -1
2037
}
2138
}
22-
return 0
39+
40+
return operator ? handleOperator(0, operator) : 0
2341
}
42+
43+
function handleOperator(
44+
compareResult: number,
45+
operator: ComparisonOperator,
46+
): boolean {
47+
switch (operator) {
48+
case '>':
49+
return compareResult > 0
50+
case '<':
51+
return compareResult < 0
52+
case '=':
53+
case '==':
54+
return compareResult === 0
55+
case '>=':
56+
return compareResult >= 0
57+
case '<=':
58+
return compareResult <= 0
59+
case '!=':
60+
case '!==':
61+
return compareResult !== 0
62+
default:
63+
throw new Error(`Unsupported operator: ${operator}`)
64+
}
65+
}
66+
67+
export default compareVersion

src/types.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,3 +280,13 @@ export interface DotImageCanvasOptions {
280280
direction?: Direction
281281
isPreferred?: boolean
282282
}
283+
284+
export type ComparisonOperator =
285+
| '>'
286+
| '<'
287+
| '='
288+
| '=='
289+
| '>='
290+
| '<='
291+
| '!='
292+
| '!=='

0 commit comments

Comments
 (0)