Strict Standards: Resource ID#34 used as offset, casting to integer (34) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#36 used as offset, casting to integer (36) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#37 used as offset, casting to integer (37) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401
ТвойWeb :: Версия для печати :: функции сортировки для метода sort()
ТвойWeb » WebMaster класс » JavaScript » функции сортировки для метода sort()

Страниц (2): [1] 2 »
 

1. Самоделкин - 10 Мая, 2008 - 14:23:51 - перейти к сообщению
Есть две вспомогательных функции для сортировки текстовых массивов (для аргумента метода sort()).
Одна - для сортировки без учёта регистра:

CODE:
function anyCase (x,y)
{
if (x.toLowerCase()<y.toLowerCase())
{return -1;}
if (x.toLowerCase()>y.toLowerCase())
{return 1;}
return 0;
}


Другая - для учёта буквы Ё (только по первым буквам):

CODE:
function yoMoyo(x, y) {
if (x.charCodeAt(0)>=1025) // "Ё"
{
if (x.charCodeAt(0)<=1071) // большие буквы
{ if (x.charCodeAt(0)<=1045 && y.charCodeAt(0)==1025)
{return -1;}
else
{if (x.charCodeAt(0)==1025 && y.charCodeAt(0)<=1045)
{return 1;}
else
{return 0;}
}
}
else
{if (x.charCodeAt(0)>=1072) // маленькие буквы
{if (x.charCodeAt(0)>=1078 && y.charCodeAt(0)==1105)
{return 1;}
else
{if (x.charCodeAt(0)==1105 && y.charCodeAt(0)>=1078)
{return -1;}
else
{return 0;}
}
}
}
}
return 0;
}


Сами по себе обе работают.
1. Не получается совместить их
2. Непонятно, как сортировать в строгом алф. порядке: for (i in ГДЕ?) Метод sort() ведь аргументов функции не принимает.
2. Самоделкин - 10 Мая, 2008 - 19:35:59 - перейти к сообщению
Совмещение получается, но каким-то "левым" способом:
CODE:
function reSort(n) {
var m = n.sort(anyCase);
return m.sort(yoMoyo);
}

И саму функцию Ё немного оптимизировал:
CODE:
function yoMoyo(x, y) {
var anyX = x.toLowerCase();
var anyY = y.toLowerCase();
if (anyX.charCodeAt(0)>=1072)
{if (anyX.charCodeAt(0)>=1078 && anyY.charCodeAt(0)==1105)
return 1;
if (anyX.charCodeAt(0)==1105 && anyY.charCodeAt(0)>=1078)
return -1;
}
return 0;
}

Вопрос по строгому алфавитному порядку остаётся открытым.
3. Furax - 10 Мая, 2008 - 22:50:18 - перейти к сообщению
CODE:
function caseUnsensitiveSort(x, y)
{
x = x.toLowerCase();
y = y.toLowerCase();

if (x==y)
return 0;

x=x.split('');
y=y.split('');

var i;

for (i =0; i<x.length; ++i)
if (x[i] == 'ё')
x[i] = 'е'.charCodeAt(0)+0.5;
else
x[i] = x[i].charCodeAt(0);

for (i =0; i<y.length; ++i)
if (y[i] == 'ё')
y[i] = 'е'.charCodeAt(0)+0.5;
else
y[i] = y[i].charCodeAt(0);

var length = Math.min(x.length, y.length);

for (var i=0; i<length; ++i)
if (x[i] != y[i])
return x[i]-y[i];

if (x.length > y.length)
return 1;
else
return -1;
}

a = ["Вася", "Васёк", "ВасИлий", "ВасЕк", "Вас"];

a.sort(caseUnsensitiveSort);


Это, что называется, "в лоб", без оптимизаций.
4. Самоделкин - 10 Мая, 2008 - 23:24:38 - перейти к сообщению
Furax
В Мозилле и Опере работает, в IE выдаёт undefined.
Цепляется к строке
CODE:
x=x.split('');

А лично мне пока непонятно, что такое 0.5
CODE:
x[i] = 'е'.charCodeAt(0)+0.5;


Ага, понял. Остроумно. Но почему в "Осле" тормозит, не разобрался.
5. Furax - 10 Мая, 2008 - 23:45:46 - перейти к сообщению
Тогда так:
CODE:
function caseUnsensitiveSort(x, y)
{
x = x.toLowerCase();
y = y.toLowerCase();

if (x==y)
return 0;

var xCodes = [];
var yCodes = [];

var i;

for (i=0; i<x.length; ++i)
if (x.charAt(i) == 'ё')
xCodes[i] = 'е'.charCodeAt(0)+0.5;
else
xCodes[i] = x.charCodeAt(i);

for (i=0; i<y.length; ++i)
if (y.charAt(i) == 'ё')
yCodes[i] = 'е'.charCodeAt(0)+0.5;
else
yCodes[i] = y.charCodeAt(i);

var length = Math.min(x.length, y.length);

for (var i=0; i<length; ++i)
if (xCodes[i] != yCodes[i])
return xCodes[i]-yCodes[i];

if (x.length > y.length)
return 1;
else
return -1;
}

a = ["Вася", "Васёк", "ВасИлий", "ВасЕк", "Вас"];

document.write(a.sort(caseUnsensitiveSort).join(', '));
Хотя лично я не понимаю, чем этот вариант лучше, но Ишаку виднее.

Что такое +0.5? Просто коды букв задаются целыми числами, а "ё" стоит на отшибе. Вот я её и впихнул на место. Целое между двух целых не впихнёшь, вот я дробь и вставил.
6. ETC - 11 Мая, 2008 - 05:01:45 - перейти к сообщению
CODE:
a = ["Вася", "Васёк", "ВасИлий", "ВасЕк", "Вас"];
a = a.join('::').replace('ё','%b%').replace('е','%a%').replace('Ё','%bB%').replace('Е','%A%').split('::');
a.sort(Array.CASEINSENSITIVE);
a = a.join('::').replace('%A%','Е').replace('%a%','е').replace('%B%','Ё').replace('%b%','ё').split('::');
document.write(a.join(', ')+'<br>');
7. Furax - 11 Мая, 2008 - 05:11:51 - перейти к сообщению
ETC
JavaScript не знает объекта Array.CASEINSENSITIVE.
8. ETC - 11 Мая, 2008 - 05:14:00 - перейти к сообщению
А, ну тогда просто sort(), не суть важно.
9. Furax - 11 Мая, 2008 - 05:54:48 - перейти к сообщению
ETC
В Твоём коде '%' при сортировке воспринимается интерпритатором как спецсимвол? Ссылочку не дашь?
10. ETC - 11 Мая, 2008 - 06:02:12 - перейти к сообщению
Никак не воспринимается, можно проценты фигурными скобками заменить, это особого значения не имеет.

Форум на AlfaSpace.NET


Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.0391]     [ Gzipped ]



Notice: ob_end_flush(): failed to send buffer of ob_gzhandler (1) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/page_tail.php on line 33