Skip to content

Instantly share code, notes, and snippets.

@armed
Created December 16, 2010 15:44
Show Gist options
  • Save armed/743542 to your computer and use it in GitHub Desktop.
Save armed/743542 to your computer and use it in GitHub Desktop.
Сортировка адресов на клиенте
var addresses = ['Метрополь', '2', '1', '2a', '1/10', '2b/21/3', '4', '3в', '11b', '3b/4', '№3a/4'];
function compareAddresses(adr1, adr2) {
var nums = getNumberArray(adr1);
var nums2 = getNumberArray(adr2);
var res = compareArrays(nums, nums2);
if (res == 0) {
res = compareStrings(adr1, adr2);
}
return res;
}
function getNumberArray(str) {
var arr = str.split(/\D+/g);
var result = [];
for(var i in arr) {
var num = parseInt(arr[i]);
if (!isNaN(num)) {
result.push(num);
}
}
return result;
}
function compareArrays(a1, a2) {
var maxLen = a1.length < a2.length ? a1.length : a2.length;
var cmp = 0;
var i = 0;
while(cmp == 0) {
cmp = a1[i] - a2[i];
i++;
if (i == maxLen) {
break;
}
}
if (cmp == 0) {
cmp = a1.length - a2.length;
}
return cmp;
}
function compareStrings(a1, a2) {
var s1 = removeAllButLetters(a1);
var s2 = removeAllButLetters(a2);
if (s1 == s2) return 0;
if (s1 > s2) return 1;
return -1;
}
function removeAllButLetters(str) {
return str.replace(/[^a-zA-Zа-яА-Я]+/g,'');
}
// ["Метрополь", "1", "1/10", "2", "2a", "2b/21/3", "3в", "№3a/4", "3b/4", "4", "11b"]
addresses.sort(compareAddresses);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment