almost 5 years ago

今天我在使用歐付寶金流串接API時,他們要求把http參數按照abc字母排列來計算Hash(CheckMacValue)(有夠爛),而且排序要不分大小寫,查了MDN的資料,發現localeCompare可行,於是想用localeCompare來做不分大小寫的排列。預設直接arr.sort()是會分大小寫的,而且大寫會排在前面

在我的Chrome 40.0.2214.111 (64-bit),跑以下JavasScript

var arr = ['Benzene','Aspirin','carbon','Copper'];
arr.sort(function (a, b) {
    return a.localeCompare(b, 'en', {'sensitivity': 'base'});
});

會是以下結果:

["Aspirin", "Benzene", "carbon", "Copper"]

很正確,因為大小寫忽略,所以carbon的第二個字母:a,理所當然排在Coppero前面了

但在我的Node.js v0.10.33上
會是以下結果

[ 'Aspirin', 'Benzene', 'Copper', 'carbon' ]

第二個字母o卻排到了a前面,和直接arr.sort()結果一樣。

Node.js v0.10.x上臨時解決辦法:比較時把字全部轉成小寫

var arr = ['Aspirin','Benzene','carbon','Copper'];
arr.sort(function (a, b) {
    return a.toLowerCase().localeCompare(b.toLowerCase());
});

真是奇怪的問題,看來Node.js使用的JavaScript還不支援localeCompare的sensitivity設定
返回結果和直接arr.sort()是一樣的。希望寫在這邊可以避免大家繞遠路!

MDN資料裡面最下面有browser compability,看來這並無法跨平台啊!Server上是固定環境沒話說,但在Client的JavaScript就最好別用到這個功能了。

EDIT:

把Node.js升級到v0.12.0之後,就有支援、沒有問題了

因此如果你要做package給人家用,最好還是不要使用此功能。
因為現在在Ubuntu 14.04下,預設repo用apt-get install nodejs安裝的版本,還會是舊版的v0.10.x的。

← 在 Ubuntu VPS 上設定虛擬記憶體 (Swap) 來解決RAM不夠用的問題 Node.js fs 不要使用 errno 來判斷錯誤類型 →
 
comments powered by Disqus