5

我知道您可以使用方法“ localeCompare ”对具有您自己的本地化的数组进行排序,如下所示:

aArray.sort(function(a,b){return a.localeCompare(b)});

但是,我假设我的瑞典语网站的大多数(几乎所有)访问者都了解瑞典语,因此无论他/她当前使用的是哪个“语言环境”,他们都会期望瑞典语排序。

(我认为现在有些人会很想就这个假设争论,但我真的认为理解瑞典语但目前使用其他语言环境的人会比不知道瑞典语字母表的人多会期望“å”和“ä”与“a”和“ö”等价排序与“o”等价。我真的希望最后三个瑞典字母“åäö”始终按该顺序排序,不管浏览器或操作系统,无论是什么定义了方法“ localeCompare ”使用的“语言环境”)

一种解决方案可能是以编程方式强制执行调用方法“localeCompare”时使用的“语言环境”,但据我所知,这是不可能的。(虽然如果它真的是可能的,那么你如何改变语言环境?)

这个排序问题对所有瑞典 javascript 程序员来说应该是相当普遍的,但我仍然无法找到任何开源库,其中实现了瑞典字符串的比较方法。这里有没有人知道这样一个库(与 sort 方法一起使用时具有良好的性能)来重用而不是尝试自己实现它?

4

3 回答 3

1

JavaScript Internationalization API 提供您所需要的。我参考的页面上有一些使用示例。不幸的是,它还没有被浏览器广泛支持。

于 2013-01-25T21:33:08.833 回答
0

@Richard Marr(评论Is there any javascript library with implementations for letters such as swedish?

好吧,我不确定这会非常困难,但对我来说,让它像使用 javascript 一样高效可能并不容易。感觉就像在尝试重新发明轮子,而擅长 javascript 的人可能已经比我做得更好了。考虑到有多少开源库存在于几乎任何东西上,当我不得不意识到这个东西还不存在时,我会有点惊讶。

关于您的代码片段

'sort(function(a,b){ return position[a] - position[b]; })' 

在我看来,您期望 a 和 b 是字符。例如,我想您想到的是以下类型的结构:

var position = {
// e.g. essentially the codes here: http://en.wikipedia.org/wiki/Multinational_Character_Set
'A': 65,
'B': 66,
//...
// the three swedish characters:
//'Ä': 196, 
//'Å: 197,
//'Ö': 214,
// The above are the correct values according to the codes, but the relative ordering of Å and Ä is not correct for swedish so therefore I switch the values below:
'Å': 196, 
'Ä': 197,
'Ö': 214
};

确实可以使用这样的位置结构,但是由于 sort 方法的函数参数接收两个任意字符串而不是只有一个字符的字符串,所以我猜两个字符串中的每个字符(直到第一个差异)都必须被迭代和与职位结构相比。我希望有一种更好(更有效)的方式来做到这一点......

于 2013-01-25T21:15:46.853 回答
0

@Pawel Dyda(评论是否有任何 javascript 库实现了诸如瑞典语之类的字母排序方法?

不,不是 JS-only,但我找到了 jQuery tablesorter,我认为这是一个不错的,但是当我找到以下代码时遇到了排序问题:

$('table').tablesorter({ 
  textSorter: function(a,b) { 
    return a.localeCompare(b); 
  } 
});

(记录在页面http://mottie.github.com/tablesorter/docs/的“sortLocaleCompare”中)

事实上,我打算在服务器上实现排序,也支持禁用 javascript 的客户端,但对于使用 javascript 的客户端,我认为我可以使用 tablesorter 而无需再次请求 Web 服务器以获得相同的结果集(但排序不同)。至少对于足够小的不需要分页的结果集实现它是非常简单的,即当所有行都适合一页时,您可以为 jQuery 表排序器生成“ serverSideSorting: false ”,然后它会自动在网络中对其进行排序浏览器。

于 2013-01-25T21:18:54.593 回答