如何按最早开业日期对含日期数组的国家对象数组排序?
如何按办公室最早开业日期对国家数组排序?
给定一个记录办公室开业/关闭信息的国家对象数组,需按每个国家最早的办公室开业日期从早到晚排序;无开业记录的对象排在最后(可按需调整到首位)。已知每个国家的officeOpened数组已预先按日期排序,只需取第一个元素的日期作为排序依据。
原始数组
const countriesList = [ { country: 'USA', officeOpened: [ {date: '2016-04-01', city: 'Denver'}], officeClosed: [ {date: '2016-10-01', city: 'NY'}] }, { country: 'UK', officeOpened: [{date: '2023-05-01', city: 'London'}], officeClosed: [] }, { country: 'China', officeOpened: [{date: '2015-01-01', city: 'Shanghai'}], officeClosed: [] }, { country: 'No-office', officeOpened: [], officeClosed: [] }, { country: 'Many-offices', officeOpened: [{date: '2023-04-01', city: 'A'} , {date: '2023-06-01', city: 'B'}], officeClosed: [] } ];
期望输出
const sortedCountriesList = [ { country: 'China', officeOpened: [{date: '2015-01-01', city: 'Shanghai'}], officeClosed: [] }, { country: 'USA', officeOpened: [ {date: '2016-04-01', city: 'Denver'}], officeClosed: [ {date: '2016-10-01', city: 'NY'}] }, { country: 'Many-offices', officeOpened: [{date: '2023-04-01', city: 'A'} , {date: '2023-06-01', city: 'B'}], officeClosed: [] }, { country: 'UK', officeOpened: [{date: '2023-05-01', city: 'London'}], officeClosed: [] }, { country: 'No-office', officeOpened: [], officeClosed: [] } ];
解决方案
实现思路
利用数组sort()方法自定义排序逻辑:
- 提取每个国家
officeOpened数组的首个日期(数组非空时); - 给无开业记录的对象设置极晚日期,确保其排在末尾;
- 直接用字符串比较日期(
YYYY-MM-DD格式可直接按字符顺序判断先后)。
代码实现
const sortedList = [...countriesList].sort((a, b) => { // 安全获取首个开业日期,无记录则设为极晚日期 const aDate = a.officeOpened[0]?.date || '9999-12-31'; const bDate = b.officeOpened[0]?.date || '9999-12-31'; // 按日期升序排序 return aDate.localeCompare(bDate); });
逻辑说明
- 用扩展运算符
[...countriesList]复制原数组,避免修改原数据; - 可选链
?.防止数组为空时触发报错; - 若需将无开业记录的对象排到首位,只需把默认日期改为
'0000-01-01'; localeCompare()返回的正负值正好匹配sort()方法的排序规则。
内容的提问来源于stack exchange,提问作者Lacie
相关产品推荐
相关产品推荐

