Skip to content

Instantly share code, notes, and snippets.

@six8
Created September 28, 2012 20:10
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save six8/3801861 to your computer and use it in GitHub Desktop.
Save six8/3801861 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.
// 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