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

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

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

Strict Standards: Resource ID#26 used as offset, casting to integer (26) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401
ТвойWeb :: функции сортировки для метода sort() [2]
ТвойWeb ТвойWeb
Качественный Европейский хостинг
Форум для чайников
 Чат на форуме      Помощь      Поиск      Пользователи


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

> Без описания
Furax
Отправлено: 11 Мая, 2008 - 07:13:51
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




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(', '));

(Отредактировано автором: 11 Мая, 2008 - 07:14:32)

 
 Top
ETC Администратор
Отправлено: 11 Мая, 2008 - 08:31:14
Post Id



Flash-coder


Покинул форум
Сообщений всего: 5275
Дата рег-ции: Дек. 2003  
Откуда: TimeZero

Карма 26




Что заменять? Я заменил пару букв всего, потом обратно вернул.

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('::');
 
 Top
Furax
Отправлено: 11 Мая, 2008 - 08:54:22
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




Слова "Васа" и "ВасА" в словарь попробуй добавить...
 
 Top
ETC Администратор
Отправлено: 11 Мая, 2008 - 12:37:44
Post Id



Flash-coder


Покинул форум
Сообщений всего: 5275
Дата рег-ции: Дек. 2003  
Откуда: TimeZero

Карма 26




Ну, можно немного пошаманить:

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);
 
 Top
Самоделкин
Отправлено: 11 Мая, 2008 - 16:05:47
Post Id



Junior Member


Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2005  

Карма 1




Все эти варианты с разными массивами ведут себя по-разному, а иногда плодят ошибки. Вот, наколдовал универсальный вариант, но опять же в 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>');

(Отредактировано автором: 11 Мая, 2008 - 16:13:44)

 
 Top
Самоделкин
Отправлено: 11 Мая, 2008 - 16:31:45
Post Id



Junior Member


Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2005  

Карма 1




Когда писал последний ответ, не видел последних сообщений. Сейчас подправил последнюю функцию ЕТС - вроде, работает нормально.
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));
 
 Top
ETC Администратор
Отправлено: 12 Мая, 2008 - 01:24:39
Post Id



Flash-coder


Покинул форум
Сообщений всего: 5275
Дата рег-ции: Дек. 2003  
Откуда: TimeZero

Карма 26




Самоделкин, что-то я не пойму, в чем смысл «правки»?

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);
 
 Top
Самоделкин
Отправлено: 14 Мая, 2008 - 11:35:44
Post Id



Junior Member


Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2005  

Карма 1




ETC
Браузер ругался на это
CODE:
a= a.toLowerCase().replace('ё','е'+String.fromCharCode(1110));

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

Это всё "жабья" типизация: то позволяет полный беспредел, то вдруг начинает гайки закручивать. Единственным реальным методом остаётся тык()

(Отредактировано автором: 14 Мая, 2008 - 11:40:31)

 
 Top
ETC Администратор
Отправлено: 14 Мая, 2008 - 13:11:46
Post Id



Flash-coder


Покинул форум
Сообщений всего: 5275
Дата рег-ции: Дек. 2003  
Откуда: TimeZero

Карма 26




У меня не ругался, я пофиксил просто ошибку со значением.
 
 Top
Страниц (2): « 1 [2]
Сейчас эту тему просматривают: 2 (гостей: 2, зарегистрированных: 0, скрытых: 0)
« JavaScript »


Все гости форума могут просматривать этот раздел.
Только администраторы и модераторы могут создавать новые темы в этом разделе.
Только администраторы и модераторы могут отвечать на сообщения в этом разделе.



Форум на AlfaSpace.NET


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

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