আমি সংস্করণ থেকে @ 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
এখানে সমস্যাটি হ'ল সংস্করণ সংখ্যার উপ-সংখ্যাগুলি হ'ল কিছু ক্ষেত্রে, পিছনের শূন্যগুলি দিয়ে কাটা হয়েছে (কমপক্ষে আমি সম্প্রতি এটি বিভিন্ন সফ্টওয়্যার ব্যবহার করার সময় দেখেছি) যা কোনও সংখ্যার যুক্তিযুক্ত অংশের মতো, তাই:
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);
সুতরাং প্রথমটি বাদে প্রতিটি উপ-নম্বরকে একটি ভাসমান হিসাবে তুলনা করা হবে 09
এবং তাই 1
হয়ে যাবে 0.09
এবং 0.1
সেই অনুসারে এবং সঠিকভাবে এইভাবে তুলনা করা হবে । 2054
এবং 3
হয়ে যাবে 0.2054
এবং0.3
।
এর পরে সম্পূর্ণ সংস্করণটি হ'ল (ক্রেডিট @ মার 10 ):
/** 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;
}
}