根据我的研究和谷歌搜索,JavaScript似乎缺乏支持区域意识排序和字符串比较。有localeCompare()
,但它已reported of browser specific differencies和不可能明确设置使用哪个区域设置(OS区域设置并不总是需要的)。有一些intentions to add collation support inside ECMAScript,但在它之前,我们是在我们自己的。并取决于浏览器的结果如何一致,可能是我们永远在我们自己:(准备排序封闭
我有以下的代码,这使得按字母顺序排序的数组。它的速度记住,并得到了想法从https://stackoverflow.com/a/11598969/1691517,我做了一些速度的改进
在这个例子中,单词数组有13个成员和排序函数被称为34次我想要替换单词中的一些字母数组(你因为这不是问题中的要点)如果我在分类函数(以return function(a, b)
开头的那个)中进行这些替换,代码是效率低下的,因为替换的次数多于每个阵列成员一次,当然我可以做到这一点在此封闭之外进行替换,我的意思是在行words.sort(sortbyalphabet_timo);
之前,但它不是我想要的。
问题1:是否可以修改行“准备开始”和“准备结束”之间的单词数组,以便排序功能使用修改后的单词数组?
问题2:是否可以向闭包输入参数,以便准备开始和准备完成之间的代码可以使用它们?我曾经尝试这样做没有成功:
var caseinsensitive = true;
words.sort(sortbyalphabet_timo(caseinsensitive));
这里是最后的代码示例,并准备好运行例子在http://jsfiddle.net/3E7wb/:
var sortbyalphabet_timo = (function() {
// PREPARATION STARTS
var i, alphabet = "-AaÀàÁáÂâÃãÄä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());`
你有一个非常有趣的字母表。 – jbabey
是吗?该功能是由用户可以添加他/她想要的任何字母组成的。这只是一个可能的字符顺序的例子。请使用你想要的。 –