-
-
Save tjmoore/af63996e398d743d659b to your computer and use it in GitHub Desktop.
jslinted version of version_compare.js
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
/** | |
* From: https://gist.github.com/TheDistantSea/8021359 | |
* | |
* Compares two software version numbers (e.g. "1.7.1" or "1.2b"). | |
* | |
* This function was born in http://stackoverflow.com/a/6832721. | |
* | |
* @param {string} v1 The first version to be compared. | |
* @param {string} v2 The second version to be compared. | |
* @param {object} [options] Optional flags that affect comparison behavior: | |
* <ul> | |
* <li> | |
* <tt>lexicographical: true</tt> compares each part of the version strings lexicographically instead of | |
* naturally; this allows suffixes such as "b" or "dev" but will cause "1.10" to be considered smaller than | |
* "1.2". | |
* </li> | |
* <li> | |
* <tt>zeroExtend: true</tt> changes the result if one version string has less parts than the other. In | |
* this case the shorter string will be padded with "zero" parts instead of being considered smaller. | |
* </li> | |
* </ul> | |
* @returns {number|NaN} | |
* <ul> | |
* <li>0 if the versions are equal</li> | |
* <li>a negative integer iff v1 < v2</li> | |
* <li>a positive integer iff v1 > v2</li> | |
* <li>NaN if either version string is in the wrong format</li> | |
* </ul> | |
* | |
* @copyright by Jon Papaioannou (["john", "papaioannou"].join(".") + "@gmail.com") | |
* @license This function is in the public domain. Do what you want with it, no strings attached. | |
*/ | |
function versionCompare(v1, v2, options) { | |
'use strict'; | |
var i, | |
lexicographical = options && options.lexicographical, | |
zeroExtend = options && options.zeroExtend, | |
v1parts = v1.split('.'), | |
v2parts = v2.split('.'); | |
function isValidPart(x) { | |
return (lexicographical ? /^\d+[A-Za-z]*$/ : /^\d+$/).test(x); | |
} | |
if (!v1parts.every(isValidPart) || !v2parts.every(isValidPart)) { | |
return NaN; | |
} | |
if (zeroExtend) { | |
while (v1parts.length < v2parts.length) { | |
v1parts.push("0"); | |
} | |
while (v2parts.length < v1parts.length) { | |
v2parts.push("0"); | |
} | |
} | |
if (!lexicographical) { | |
v1parts = v1parts.map(Number); | |
v2parts = v2parts.map(Number); | |
} | |
for (i = 0; i < v1parts.length; i += 1) { | |
if (v2parts.length === i) { | |
return 1; | |
} | |
if (v1parts[i] < v2parts[i]) { | |
return -1; | |
} | |
if (v1parts[i] > v2parts[i]) { | |
return 1; | |
} | |
} | |
if (v1parts.length !== v2parts.length) { | |
return -1; | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment