时区排序需求调整:按GMT-、无偏移、GMT+顺序排列
时区数组排序修正方案
问题说明
需要将时区数组按以下固定顺序排序:
- 带GMT-偏移的时区
- 无正负偏移的中性时区(即
(GMT)开头的项) - 带GMT+偏移的时区
现有排序代码会将中性时区排在最后,不符合需求,需调整排序逻辑。
原代码问题分析
原正则仅匹配带GMT+/GMT-的时区,中性时区的label无法匹配正则,导致parseFloat返回NaN。在排序比较中,NaN与任何数值比较结果都是false,最终中性时区被默认放到数组末尾。
修正后的代码
const SortTimezoneCompare = (data) => { return data.sort((a, b) => { // 标记时区类型:负偏移=0,中性=1,正偏移=2 const getZoneType = (label) => { if (label.includes('GMT-')) return 0; if (label.startsWith('(GMT)')) return 1; if (label.includes('GMT+')) return 2; return 1; }; const aType = getZoneType(a.label); const bType = getZoneType(b.label); // 先按类型排序,类型不同直接返回差值 if (aType !== bType) { return aType - bType; } // 同类型下,解析偏移值进行精细排序 const parseOffset = (label) => { const match = label.match(/^\(GMT([+-]?)(\d{1,2}):?(\d{1,2})?\)/); if (!match) return 0; const sign = match[1] === '-' ? -1 : 1; const hours = parseInt(match[2] || 0, 10); const minutes = parseInt(match[3] || 0, 10); return sign * (hours + minutes / 60); }; const aOffset = parseOffset(a.label); const bOffset = parseOffset(b.label); return aOffset - bOffset; }); }; // 测试数组 const array = [ { "defaultOrder": 34, "label": "(GMT-01:00) Cape Verde Islands", "codeId": 1218, "code": "CVT", "codeDesc": "(GMT-01:00) Cape Verde Islands", "codeQualifier": "Time_Zone_Cd" }, { "defaultOrder": 41, "label": "(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna", "codeId": 297, "code": "CET", "codeDesc": "(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna", "codeQualifier": "Time_Zone_Cd" }, { "defaultOrder": 40, "label": "(GMT) Monrovia, Reykjavik", "codeId": 1220, "code": "GMT02", "codeDesc": "(GMT) Monrovia, Reykjavik", "codeQualifier": "Time_Zone_Cd" }, { "defaultOrder": 33, "label": "(GMT-02:00) Mid-Atlantic", "codeId": 1219, "code": "GST", "codeDesc": "(GMT-02:00) Mid-Atlantic", "codeQualifier": "Time_Zone_Cd" }, { "defaultOrder": 42, "label": "(GMT+02:00) Athens, Bucharest", "codeId": 300, "code": "EET", "codeDesc": "(GMT+02:00) Athens, Bucharest", "codeQualifier": "Time_Zone_Cd" } ]; const sortedArray = SortTimezoneCompare(array); console.log(sortedArray);
代码逻辑说明
- 类型分组排序:通过
getZoneType给每个时区分配类型标识,确保负偏移(0)→ 中性(1)→ 正偏移(2)的顺序优先级。 - 同类型精细排序:
- 负偏移时区:按偏移绝对值从大到小排列(如
GMT-02排在GMT-01前) - 正偏移时区:按偏移值从小到大排列(如
GMT+01排在GMT+02前) - 中性时区统一归为偏移值0,保持原有相对顺序(若有多个中性时区)
- 负偏移时区:按偏移绝对值从大到小排列(如
验证结果
运行代码后,输出顺序为:
(GMT-02:00) Mid-Atlantic(GMT-01:00) Cape Verde Islands(GMT) Monrovia, Reykjavik(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna(GMT+02:00) Athens, Bucharest
完全符合需求排序规则。
内容的提问来源于stack exchange,提问作者3gwebtrain
相关产品推荐
相关产品推荐

