javascript - 首先根据子数组然后根据日期对对象数组进行排序(不拆分数组)
问题描述
我有一个对象数组,我想根据它们是否包含字符串进行排序。
然后我想按时间顺序对匹配字符串的那些进行排序,然后按时间顺序对其余的进行排序。
以便
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]
有没有更优雅的解决方案?
最好不需要将数组拆分为单独的数组?
解决方案
您可以只使用.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);
}));
推荐阅读
- r - 为双打列表创建名称到“命名向量列表”
- vue.js - Vue 组件对数组的变化没有反应
- java - 在 Java 中使用 EntityManager 和 Criteria 时出现 NullPointerException
- rest - 如果我在 Groovy & Grails 中创建一个简单的控制器并将其用作 Rest API 控制器,然后扩展 RestFulController 会怎样?
- java - Android落在自定义视图基本构造函数上
- django - Django Oscar - 在结帐过程中付款详细信息过程被跳过
- c - 退出状态是可观察的行为吗?
- javascript - 为函数原型调用 Object.defineProperty 时会发生什么?
- python - 如何将 Numpy 数组转换为 Panda DataFrame
- ruby-on-rails - 带参数的自定义验证器