Страниц (2): [1] 2 » |
|
Без описания |
Поиск в теме | Версия для печати |
Самоделкин |
Отправлено: 10 Мая, 2008 - 19:35:59
|
Junior Member
Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2005
Карма 1
|
Совмещение получается, но каким-то "левым" способом:
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;
}
Вопрос по строгому алфавитному порядку остаётся открытым.(Отредактировано автором: 10 Мая, 2008 - 20:07:10) |
|
|
Furax |
Отправлено: 10 Мая, 2008 - 22:50:18
|
Бледнотик
Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007
Откуда: Иркутск, Сибирь, СССР
Карма 32
|
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);
Это, что называется, "в лоб", без оптимизаций.(Отредактировано автором: 10 Мая, 2008 - 22:53:15) |
|
|
Furax |
Отправлено: 10 Мая, 2008 - 23:45:46
|
Бледнотик
Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007
Откуда: Иркутск, Сибирь, СССР
Карма 32
|
Тогда так: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? Просто коды букв задаются целыми числами, а "ё" стоит на отшибе. Вот я её и впихнул на место. Целое между двух целых не впихнёшь, вот я дробь и вставил. |
|
|
ETC |
Отправлено: 11 Мая, 2008 - 05:01:45
|
Flash-coder
Покинул форум
Сообщений всего: 5275
Дата рег-ции: Дек. 2003
Откуда: TimeZero
Карма 26
|
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>'); |
|
|
|
Поиск в теме | Версия для печати |
Страниц (2): [1] 2 » |
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0, скрытых: 0) |
« JavaScript » |
Все гости форума могут просматривать этот раздел. Только администраторы и модераторы могут создавать новые темы в этом разделе. Только администраторы и модераторы могут отвечать на сообщения в этом разделе.
|
|
|