Я не могу говорить с тем, что Вы пытаетесь сделать конкретно с самой функцией, но если Вам не нравится regex быть созданным каждый раз, вот два решения и некоторые протесты о каждом.
Вот один способ сделать это:
function makeSortString(s) {
if(!makeSortString.translate_re) makeSortString.translate_re = /[öäüÖÄÜ]/g;
var translate = {
"ä": "a", "ö": "o", "ü": "u",
"Ä": "A", "Ö": "O", "Ü": "U" // probably more to come
};
return ( s.replace(makeSortString.translate_re, function(match) {
return translate[match];
}) );
}
Это, очевидно, сделает regex свойством самой функции. Единственная вещь Вам не может понравиться приблизительно это (или Вы можете, я предполагаю, что она зависит), то, что regex может теперь быть изменен за пределами тела функции. Так, кто-то мог сделать это для изменения используемого межсоюзниками regex:
makeSortString.translate_re = /[a-z]/g;
Так, существует та опция.
Один способ получить закрытие, и таким образом препятствовать тому, чтобы кто-то изменил regex, состоял бы в том, чтобы определить это как присвоение анонимной функции как это:
var makeSortString = (function() {
var translate_re = /[öäüÖÄÜ]/g;
return function(s) {
var translate = {
"ä": "a", "ö": "o", "ü": "u",
"Ä": "A", "Ö": "O", "Ü": "U" // probably more to come
};
return ( s.replace(translate_re, function(match) {
return translate[match];
}) );
}
})();
, Надо надеяться, это полезно для Вас.
<час> ОБНОВЛЕНИЕ: рано, и я не знаю, почему я не видел очевидное прежде, но могло бы также быть полезно поместить Вас translate
объект в закрытии также:
var makeSortString = (function() {
var translate_re = /[öäüÖÄÜ]/g;
var translate = {
"ä": "a", "ö": "o", "ü": "u",
"Ä": "A", "Ö": "O", "Ü": "U" // probably more to come
};
return function(s) {
return ( s.replace(translate_re, function(match) {
return translate[match];
}) );
}
})();
На основе решения Jason Bunting вот то, что я использую теперь.
Все это - для jQuery tablesorter плагин: Для (почти корректный) сортировка неанглийских таблиц с tablesorter плагином необходимо использовать пользовательское textExtraction
функция.
Этот:
'dd.mm.yyyy'
) к распознанному формату ('yyyy-mm-dd'
)Старайтесь сохранить файл JavaScript в кодировке UTF-8, или это не будет работать.
// file encoding must be UTF-8!
function getTextExtractor()
{
return (function() {
var patternLetters = /[öäüÖÄÜáàâéèêúùûóòôÁÀÂÉÈÊÚÙÛÓÒÔß]/g;
var patternDateDmy = /^(?:\D+)?(\d{1,2})\.(\d{1,2})\.(\d{2,4})$/;
var lookupLetters = {
"ä": "a", "ö": "o", "ü": "u",
"Ä": "A", "Ö": "O", "Ü": "U",
"á": "a", "à": "a", "â": "a",
"é": "e", "è": "e", "ê": "e",
"ú": "u", "ù": "u", "û": "u",
"ó": "o", "ò": "o", "ô": "o",
"Á": "A", "À": "A", "Â": "A",
"É": "E", "È": "E", "Ê": "E",
"Ú": "U", "Ù": "U", "Û": "U",
"Ó": "O", "Ò": "O", "Ô": "O",
"ß": "s"
};
var letterTranslator = function(match) {
return lookupLetters[match] || match;
}
return function(node) {
var text = $.trim($(node).text());
var date = text.match(patternDateDmy);
if (date)
return [date[3], date[2], date[1]].join("-");
else
return text.replace(patternLetters, letterTranslator);
}
})();
}
Можно использовать его как это:
$("table.sortable").tablesorter({
textExtraction: getTextExtractor()
});