-
-
Save ghostcode/c8bc8cba622c9cbeafa1 to your computer and use it in GitHub Desktop.
Javascript to compare different software version strings (ex: 1.0.4 vs 1.1.4). Can handle pre, beta, etc prefixes/suffixes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Some versions to test [v1, v2, expected result] | |
var versions = [ | |
['1.2.0', '1.2', 0], | |
['1.4', '1.7.2', 1], | |
['1.2pre', '1.2', 1], | |
['1.7', '1.1.1', -1], | |
['1.7.9RC1', '1.7.9RC2', 1], | |
['1.7.9RC1', '1.7.9RC', -1], | |
['1.7.9RC1', '1.7.9', 1], | |
['0.4beta', '0.4', 1], | |
['0.4beta', '0.4alpha', -1], | |
['0.4b', '0.4b', 0], | |
['0.0.1', '0.0.0.1', -1], | |
]; | |
// Compare test versions | |
for (var i = 0; i < versions.length; ++i) { | |
var a = versions[i][0], | |
b = versions[i][1], | |
e = versions[i][2], | |
c = version_compare(a, b); | |
document.write(a + ' <-> ' + b + ' = ' + c + ' ' + (e === c) + '<br>'); | |
} | |
/* | |
Split a version string into components and map prefixes and suffixes to integers. | |
Examples: | |
- 1.0 | |
- 2.0.4 | |
- 1.4RC | |
- 0.7beta | |
*/ | |
function version_bits(version) { | |
version = version.replace(/(\d+)([^\d\.]+)/, '$1.$2'); | |
version = version.replace(/([^\d\.]+)(\d+)/, '$1.$2'); | |
var parts = version.split('.'), | |
rmap = { | |
'rc' : -1, | |
'pre' : -2, | |
'beta' : -3, | |
'b' : -3, | |
'alpha' : -4, | |
'a' : -4, | |
}, | |
v, n; | |
var bits = []; | |
for (var i = 0; i < parts.length; ++i) { | |
v = parts[i]; | |
n = parseInt(v, 10); | |
if ( isNaN(n) ) { | |
n = rmap[v] || -1; | |
} | |
bits.push(n); | |
} | |
return bits; | |
} | |
/* | |
Compare different software version strings. | |
Returns 0 if same, -1 if version2 is older or 1 if version2 is newer. | |
*/ | |
function version_compare(version1, version2) { | |
var v1parts = version_bits(version1); | |
var v2parts = version_bits(version2); | |
var v2, v1; | |
for (var i = 0; i < Math.max(v1parts.length, v2parts.length); ++i) { | |
v1 = v1parts[i] || 0; | |
v2 = v2parts[i] || 0; | |
if (v2 > v1) { | |
return 1; | |
} | |
else if (v1 > v2) { | |
return -1; | |
} | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment