@ mar10 의 버전 을 좋아 하지만 내 관점에서 오용의 가능성이 있습니다 (버전이 시맨틱 버전 문서 와 호환되는 경우에는 해당되지 않지만 일부 "빌드 번호"가 사용 된 경우) ) :
versionCompare( '1.09', '1.1'); // returns 1, which is wrong: 1.09 < 1.1
versionCompare('1.702', '1.8'); // returns 1, which is wrong: 1.702 < 1.8
여기서 문제는 버전 번호의 하위 번호가 경우에 따라 후행 0으로 잘라 낸 것입니다 (적어도 다른 소프트웨어를 사용하는 동안 최근에 본 것처럼). 수의 합리적인 부분과 비슷합니다.
5.17.2054 > 5.17.2
5.17.2 == 5.17.20 == 5.17.200 == ...
5.17.2054 > 5.17.20
5.17.2054 > 5.17.200
5.17.2054 > 5.17.2000
5.17.2054 > 5.17.20000
5.17.2054 < 5.17.20001
5.17.2054 < 5.17.3
5.17.2054 < 5.17.30
그러나 첫 번째 (또는 첫 번째와 두 번째) 버전 하위 번호는 항상 실제로 동일한 정수 값으로 처리됩니다.
이런 종류의 버전 관리를 사용하는 경우 예제에서 몇 줄만 변경할 수 있습니다.
// replace this:
p1 = parseInt(v1parts[i], 10);
p2 = parseInt(v2parts[i], 10);
// with this:
p1 = i/* > 0 */ ? parseFloat('0.' + v1parts[i], 10) : parseInt(v1parts[i], 10);
p2 = i/* > 0 */ ? parseFloat('0.' + v2parts[i], 10) : parseInt(v2parts[i], 10);
첫 번째 제외한 모든 하위 번호를 float로서 비교할 수 있도록, 그래서 09
및 1
될 것입니다 0.09
및 0.1
그에 따라 적절하게이 방법을 비교 하였다. 2054
그리고 3
될 것입니다 0.2054
및0.3
.
완전한 버전은 다음과 같습니다 ( @ mar10의 신용 ) :
/** Compare two dotted version strings (like '10.2.3').
* @returns {Integer} 0: v1 == v2, -1: v1 < v2, 1: v1 > v2
*/
function versionCompare(v1, v2) {
var v1parts = ("" + v1).split("."),
v2parts = ("" + v2).split("."),
minLength = Math.min(v1parts.length, v2parts.length),
p1, p2, i;
// Compare tuple pair-by-pair.
for(i = 0; i < minLength; i++) {
// Convert to integer if possible, because "8" > "10".
p1 = i/* > 0 */ ? parseFloat('0.' + v1parts[i], 10) : parseInt(v1parts[i], 10);;
p2 = i/* > 0 */ ? parseFloat('0.' + v2parts[i], 10) : parseInt(v2parts[i], 10);
if (isNaN(p1)){ p1 = v1parts[i]; }
if (isNaN(p2)){ p2 = v2parts[i]; }
if (p1 == p2) {
continue;
}else if (p1 > p2) {
return 1;
}else if (p1 < p2) {
return -1;
}
// one operand is NaN
return NaN;
}
// The longer tuple is always considered 'greater'
if (v1parts.length === v2parts.length) {
return 0;
}
return (v1parts.length < v2parts.length) ? -1 : 1;
}
추신 : 속도는 느리지 만 문자열이 실제로 문자 배열이라는 사실을 작동시키는 동일한 비교 함수를 재사용하는 것이 가능합니다.
function cmp_ver(arr1, arr2) {
// fill the tail of the array with smaller length with zeroes, to make both array have the same length
while (min_arr.length < max_arr.length) {
min_arr[min_arr.lentgh] = '0';
}
// compare every element in arr1 with corresponding element from arr2,
// but pass them into the same function, so string '2054' will act as
// ['2','0','5','4'] and string '19', in this case, will become ['1', '9', '0', '0']
for (i: 0 -> max_length) {
var res = cmp_ver(arr1[i], arr2[i]);
if (res !== 0) return res;
}
}