Furax |
Отправлено: 11 Мая, 2008 - 07:13:51
|
Бледнотик
Покинул форум
Сообщений всего: 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) |
|
|
ETC |
Отправлено: 11 Мая, 2008 - 08:31:14
|
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('::');
|
|
|
ETC |
Отправлено: 11 Мая, 2008 - 12:37:44
|
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);
|
|
|
Самоделкин |
Отправлено: 11 Мая, 2008 - 16:05:47
|
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) |
|
|
Самоделкин |
Отправлено: 11 Мая, 2008 - 16:31:45
|
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)); |
|
|
ETC |
Отправлено: 12 Мая, 2008 - 01:24:39
|
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); |
|
|
Самоделкин |
Отправлено: 14 Мая, 2008 - 11:35:44
|
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) |
|
|
|