JSON陣列排序
Q:a = [{id1: '...', time: '...', desc: '....'}, {id2....},....],怎麼依據‘time’來排序array?
A:當然可以!這是在 JavaScript 中處理資料時一個非常常見且重要的操作。
let timers = [
{ id: 'id2', time: '10:30', desc: '做簡報' },
{ id: 'id1', time: '01:00', desc: '運動' },
{ id: 'id4', time: '00:15', desc: '喝水' },
{ id: 'id3', time: '05:00', desc: '冥想' }
];
方法一:轉換為 Date 物件進行比較 (最穩健、最推薦)
升序排序 (時間由小到大)
// 為了比較,我們創建一個基於相同日期的 Date 物件
const timeA = new Date(`1970-01-01T${a.time}`);
const timeB = new Date(`1970-01-01T${b.time}`);
// Date 物件可以直接相減,結果為毫秒差,正好是 sort 需要的
// 如果 timeA < timeB,結果為負數,a 排在前面
// 如果 timeA > timeB,結果為正數,b 排在前面
return timeA - timeB;
});
console.log(timers);
{ id: 'id4', time: '00:15', desc: '喝水' },
{ id: 'id1', time: '01:00', desc: '運動' },
{ id: 'id3', time: '05:00', desc: '冥想' },
{ id: 'id2', time: '10:30', desc: '做簡報' }
]
降序排序 (時間由大到小)
const timeA = new Date(`1970-01-01T${a.time}`);
const timeB = new Date(`1970-01-01T${b.time}`);
// b - a 即可得到降序結果
return timeB - timeA;
});
array.sort(compareFunction): sort 方法會接收一個函式,這個函式需要接收兩個參數 (通常命名為 a 和 b),代表陣列中正在被比較的兩個元素。 new Date('1970-01-01T' + a.time): 我們在時間字串前加上一個固定的日期 '1970-01-01T',是為了創建一個有效的 Date 物件讓 JavaScript 解析。因為我們只關心時間部分,所以日期是哪天並不重要,只要所有元素的比較基準都一樣即可。 return timeA - timeB;: 這是 sort 的核心。 如果回傳值 < 0 ,a 會被排在 b 前面。如果回傳值 > 0 ,b 會被排在 a 前面。如果回傳值 = 0 ,a 和 b 的相對位置不變。Date 物件相減的結果(毫秒差)完美地符合這個要求。
留言
張貼留言