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

Strict Standards: Resource ID#35 used as offset, casting to integer (35) 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
ТвойWeb :: Версия для печати :: функции сортировки для метода sort() [2]
ТвойWeb » WebMaster класс » JavaScript » функции сортировки для метода sort()

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

11. Furax - 11 Мая, 2008 - 07:13:51 - перейти к сообщению
CODE:
a = ["Вася", "Васёк", "ВасИлий", "ВасЕк", "Вас", "Васа"];
Тогда надо для каждой буквы замену делать, получится не компактнее, чем у меня...

З. Ы. Мой вариант лучше переписать вот так:
CODE:
function fillCodes(Str, Codes)
{
for (var i=0; i<Str.length; ++i)
if (Str.charAt(i) == 'ё')
Codes[i] = 'е'.charCodeAt(0)+0.5;
else
Codes[i] = Str.charCodeAt(i);
}


function caseUnsensitiveSort(x, y)
{
x = x.toLowerCase();
y = y.toLowerCase();

if (x==y)
return 0;

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

fillCodes(x, xCodes);
fillCodes(y, yCodes);

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(', '));
12. ETC - 11 Мая, 2008 - 08:31:14 - перейти к сообщению
Что заменять? Я заменил пару букв всего, потом обратно вернул.

CODE:
a = ["Вася", "Васёк", "ВасИлий", "ВасЕк", "Вас", "Васек", "ВасЁк"];
a = a.join('::').replace('е','%a%').replace('ё','%b%').replace('Е','%A%').replace('Ё','%B%').split('::');
a.sort(function(a,b){return a.toLowerCase()<b.toLowerCase() ? -1 : !Number(a.toLowerCase()==b.toLowerCase());});
a = a.join('::').replace('%a%','е').replace('%b%','ё').replace('%A%','Е').replace('%B%','Ё').split('::');
13. Furax - 11 Мая, 2008 - 08:54:22 - перейти к сообщению
Слова "Васа" и "ВасА" в словарь попробуй добавить...
14. ETC - 11 Мая, 2008 - 12:37:44 - перейти к сообщению
Ну, можно немного пошаманить:

CODE:
a = ["Вася", "Васёк", "ВасИлий", "ВасЕк", "Василий", "Вас", "Васек", "ВасЁк","ВасА","Васа",'Васж','ВасЖ','Васё'];
function sort(a, b) {
a = a.toLowerCase().replace('ё','е'+String.fromCharCode(1110));
b = b.toLowerCase().replace('ё','е'+String.fromCharCode(1110));
return a < b ? -1 : !Number(a==b);
}
a.sort(sort);
15. Самоделкин - 11 Мая, 2008 - 16:05:47 - перейти к сообщению
Все эти варианты с разными массивами ведут себя по-разному, а иногда плодят ошибки. Вот, наколдовал универсальный вариант, но опять же в 2 функции:
CODE:
function anyCase(x, y) {
var xCode = x.toLowerCase();
var yCode = y.toLowerCase();
if (xCode > yCode)
return 1;
if (xCode < yCode)
return -1;
else
return 0;
}

function sortForYo(a) {
a = a.join('::');
var i;
for (i=0; i<a.length; i++)
a = a.replace('ё','ея%').replace('Ё','Ея%');
a = a.split('::');
a.sort(anyCase);
a = a.join('::');
for (i=0; i<a.length; i++)
a = a.replace('Ея%','Ё').replace('ея%','ё');
a = a.split('::');
return a;
}

nnn = ["клеевая масса", "кЛеЁнка", "бред", "сиВОЙ", "кОбылы", "Дёготь", "яблоко", "Ябеда", "ёжик", "еда"];
document.write(sortForYo(nnn).join(', ')+'<br>');
16. Самоделкин - 11 Мая, 2008 - 16:31:45 - перейти к сообщению
Когда писал последний ответ, не видел последних сообщений. Сейчас подправил последнюю функцию ЕТС - вроде, работает нормально.
CODE:
nnn = ["клеевая масса", "кЛеЁнка", "бред", "сиВОЙ", "кОбылы", "Дёготь", "яблоко", "Ябеда", "ёжик", "еда"];
function uniSort(a, b) {
var aCode = a.toLowerCase().replace('ё','е'+String.fromCharCode(1110));
var bCode = b.toLowerCase().replace('ё','е'+String.fromCharCode(1110));
if (aCode > bCode)
return 1;
if (aCode < bCode)
return -1;
else
return 0;
}

document.write(nnn.sort(uniSort));
17. ETC - 12 Мая, 2008 - 01:24:39 - перейти к сообщению
Самоделкин, что-то я не пойму, в чем смысл «правки»?

UPD: А, вижу. Поправил:

CODE:
a = ["Вася", "Васёк", "ВасИлий", "ВасЕк", "Василий", "Вас", "Васек", "ВасЁк","ВасА","Васа",'Васж','ВасЖ','Васё'];
function sort(a, b) {
a = a.toLowerCase().replace('ё','е'+String.fromCharCode(1110));
b = b.toLowerCase().replace('ё','е'+String.fromCharCode(1110));
return a < b ? -1 : Number(!(a==b));
}
a.sort(sort);
18. Самоделкин - 14 Мая, 2008 - 11:35:44 - перейти к сообщению
ETC
Браузер ругался на это
CODE:
a= a.toLowerCase().replace('ё','е'+String.fromCharCode(1110));

вкупе с этим:
CODE:
return a < b ? -1 : Number(!(a==b));

Это всё "жабья" типизация: то позволяет полный беспредел, то вдруг начинает гайки закручивать. Единственным реальным методом остаётся тык()
19. ETC - 14 Мая, 2008 - 13:11:46 - перейти к сообщению
У меня не ругался, я пофиксил просто ошибку со значением.

Форум на AlfaSpace.NET


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

[Script Execution time: 0.0288]     [ 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