【发布时间】:2012-09-18 08:58:10
【问题描述】:
根据我的研究和谷歌搜索,Javascript 似乎缺乏对区域感知排序和字符串比较的支持。有localeCompare(),但一直是reported of browser specific differencies,并且无法显式设置使用哪种语言环境(操作系统语言环境并不总是需要的)。有一些intentions to add collation support inside ECMAScript,但在此之前,我们靠自己。根据不同浏览器结果的一致性,我们可能永远靠自己:(。
我有以下代码,它使数组按字母排序。它考虑了速度,想法来自https://stackoverflow.com/a/11598969/1691517,我对此做了一些速度改进。
在这个例子中,单词数组有 13 个成员,排序函数被调用了 34 次。我想替换 words-array 中的一些字母(你不必知道做了哪些替换,因为这不是这个问题的重点)。如果我在排序函数中进行这些替换(以 return function(a, b) 开头的那个),代码效率低下,因为每个数组成员多次替换。当然我可以在这个闭包之外进行这些替换,我的意思是在words.sort(sortbyalphabet_timo); 行之前,但这不是我想要的。
问题 1: 是否可以修改 "PREPARATION STARTS" 和 "PREPARATION ENDS" 行之间的单词数组,以便排序函数使用修改后的单词数组?
问题 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());`
【问题讨论】:
-
你的字母表很有趣。
-
是吗?该功能是由意图制成的,用户可以添加他/她想要的任何字母。这只是一种可能的字符顺序的示例。请使用您想要的。
标签: javascript sorting unicode collation alphabet