Согласно моим исследованиям и поиску в Google, Javascript, похоже, не поддерживает сортировку с учетом локали и сравнение строк. Существует localeCompare()
, но он сообщено о различиях в браузерах и о невозможности явного указания локали используется (локаль ОС не всегда нужная). Есть некоторые намерения добавить поддержку сопоставления внутри ECMAScript, но до этого мы сами по себе. И в зависимости от того, насколько последовательны результаты в разных браузерах, может быть, мы навсегда останемся одни :(.
У меня есть следующий код, который делает алфавитную сортировку массива. Это сделано с учетом скорости, а идеи взяты из https://stackoverflow.com/a/11598969/1691517, к которому я сделал некоторые улучшения скорости.
В этом примере массив слов состоит из 13 элементов, а функция сортировки вызывается 34 раза. Я хочу заменить некоторые буквы в массиве слов (вам не обязательно знать, какие замены сделаны, потому что это не главное в этом вопросе). Если я делаю эти замены в функции сортировки (той, которая начинается с return function(a, b)
), код неэффективен, потому что замены выполняются более одного раза для каждого члена массива. Конечно, я могу сделать эти замены вне этого закрытия, я имею в виду перед строкой words.sort(sortbyalphabet_timo);
, но это не то, что я хочу.
Вопрос 1. Можно ли изменить массив слов между строками "ПОДГОТОВКА НАЧАЛА" и "ПОДГОТОВКА ЗАВЕРШАЕТСЯ", чтобы функция сортировки использовала измененный массив слов?
Вопрос 2. Можно ли вводить аргументы для замыкания, чтобы код между PREPARATION STARTS и PREPARATION ENDS мог их использовать? Я пробовал это без успеха:
var caseinsensitive = true;
words.sort( sortbyalphabet_timo(caseinsensitive) );
И вот, наконец, пример кода, и готовый к запуску пример находится в http://jsfiddle.net/3E7wb/< /а>:
var sortbyalphabet_timo = (function() {
// PREPARATION STARTS
var i, alphabet = "-0123456789AaÀàÁáÂâÃãÄäBbCcÇçDdEeÈèÉéÊêËëFfGgHhIiÌìÍíÎîÏïJjKkLlMmNnÑñOoÒòÓóÔôÕõÖöPpQqRrSsTtUuÙùÚúÛûÜüVvWwXxYyÝýŸÿZz",
index = {};
i = alphabet.length;
while (i--) index[alphabet.charCodeAt(i)] = i;
// PREPARATION ENDS
return function(a, b) {
var i, len, diff;
if (typeof a === "string" && typeof b === "string") {
(a.length > b.length) ? len = a.length : len = b.length;
for (i = 0; i < len; i++) {
diff = index[a.charCodeAt(i)] - index[b.charCodeAt(i)];
if (diff !== 0) {
return diff;
}
}
// sort the shorter first
return a.length - b.length;
} else {
return 0;
}
};
})();
var words = ['tauschen', '66', '55', '33', 'täuschen', 'andern', 'ändern', 'Ast', 'Äste', 'dosen', 'dösen', 'Donaudam-0', 'Donaudam-1'];
$('#orig').html(words.toString());
words.sort(sortbyalphabet_timo);
$('#sorted').html(words.toString());`