首页 > 解决方案 > 首先根据子数组然后根据日期对对象数组进行排序(不拆分数组)

问题描述

我有一个对象数组,我想根据它们是否包含字符串进行排序。

然后我想按时间顺序对匹配字符串的那些进行排序,然后按时间顺序对其余的进行排序。

以便

const role = waiter
const jobs = [
{ 
"date": "2021-09-30T00:00:00",
"role": [chef, porter]
},
{ 
"date": "2021-09-28T00:00:00",
"role": [waiter, chef]
},
{ 
"date": "2021-09-29T00:00:00",
"role": [waiter, chef]
},
{ 
"date": "2021-09-01T00:00:00",
"role": [chef]
},
]

应该变成:

[
{ 
"date": "2021-09-28T00:00:00",
"role": [waiter, chef]
},
{ 
"date": "2021-09-29T00:00:00",
"role": [waiter, chef]
},
{ 
"date": "2021-09-01T00:00:00",
"role": [chef]
},
{ 
"date": "2021-09-30T00:00:00",
"role": [chef, porter]
},
]

到目前为止,我能找到的唯一解决方案是将数组分成两个单独的数组。将它们单独排序,然后将它们合并为一个。

我目前的解决方案:

 const arrOne = jobs
    .filter((j) => j.role.includes(role))
    .sort((a, b) =>
      compareDesc(
        a.date,b.date
      )
    );

 const arrTwo = jobs
    .filter((j) => !j.role.includes(role))
    .sort((a, b) =>
      compareDesc(
        a.date,b.date
      )
    );

const finalArr = [...arrOne,...arrTwo]

有没有更优雅的解决方案?

最好不需要将数组拆分为单独的数组?

标签: javascriptarrayssorting

解决方案


您可以只使用.sort并输入排序条件(如果两者都匹配角色,然后按日期,如果只有第一个,它首先,它只有第二个,它首先,如果没有,然后按日期):

const chef = 'chef';
const porter = 'porter';
const waiter = 'waiter';

const role = waiter;

const jobs = [
{ 
"date": "2021-09-30T00:00:00",
"role": [chef, porter]
},
{ 
"date": "2021-09-28T00:00:00",
"role": [waiter, chef]
},
{ 
"date": "2021-09-29T00:00:00",
"role": [waiter, chef]
},
{ 
"date": "2021-09-01T00:00:00",
"role": [chef]
}
]


console.log(jobs.sort((a, b) => {
    if (a.role.includes(role) && b.role.includes(role)) {
        return new Date(a.date) - new Date(b.date);
    } else if (a.role.includes(role)) {
        return -1;
    } else if (b.role.includes(role)) {
        return 1;
    }
    return new Date(a.date) - new Date(b.date);
}));


推荐阅读