javascript - 如何避免必须对具有 2 个条件的 javascript 数组进行两次排序
问题描述
我有一个订单数组,我需要根据delivery_time
属性对其进行排序,以便可以首先处理最早的订单。但我们也可以选择立即交付订单。因此,无论交货时间如何,即时delivery_method
订单都需要位于数组的开头。
现在我通过使用 2 个排序函数来实现这一点,第一个基于delivery_time
属性对订单进行排序,第二个基于属性对数组进行排序delivery_method_id
(delivery_method_id == 1
意味着它的立即交付)。如何仅使用一种sort
功能获得相同的结果?
orders.sort((a, b) => {
return a.delivery_time - b.delivery_time; //sort based on delivery_time
}).sort((a, b) => {
return a.delivery_method_id === 1 ? -1: 0; //sort based on delivery_method_id
});
我尝试在第一个排序函数本身中保留这两个条件,但在这种情况下,我在每天的开始位置而不是在第一个位置获得即时交货订单(我希望我清楚地解释了这种情况)
如何避免使用两个函数对该订单数组进行排序?如果它也可以使用,我已经安装了 underscore.js。
样本数据(订单)
[{
"id": 149677,
"delivery_time": "2020-02-20 19:00:00",
"delivery_method_id": 2
}, {
"id": 149737,
"delivery_time": "2020-02-20 21:00:00",
"delivery_method_id": 2
}, {
"id": 160919,
"delivery_time": "2020-03-12 13:00:00",
"delivery_method_id": 3
},
{
"id": 160920,
"delivery_time": "2020-03-12 13:00:00", // according to delivery time, this should be at the bottom, but because the delivery_method_id == 1 , I need to push this to the top/beginning of array, this is why I had to use 2 sorts
"delivery_method_id": 1
}]
解决方案
因此,假设您还希望 2 和 3 在它之后,那么我们将检查 id 是否相等,如果它们是我们按日期排序,如果它们不是,我们按 id 排序。
var data = [{
"id": 149677,
"delivery_time": "2020-02-20 19:00:00",
"delivery_method_id": 2
}, {
"id": 149737,
"delivery_time": "2020-02-20 21:00:00",
"delivery_method_id": 2
}, {
"id": 160919,
"delivery_time": "2020-03-12 13:00:00",
"delivery_method_id": 3
},
{
"id": 160920,
"delivery_time": "2020-03-12 13:00:00",
"delivery_method_id": 1
}
]
var updated = data.sort((a,b) => {
var sortProp = a.delivery_method_id === b.delivery_method_id ? 'delivery_time' : 'delivery_method_id'
return a[sortProp] > b[sortProp] ? 1 : -1
})
console.log(updated)
推荐阅读
- android - 如何从 crashlytics 清除我的应用注销数据
- python - 有没有为 AVX 指令编译的 TensorFlow 版本?
- visual-studio-code - 服务器代码VS代码上忽略的断点
- cmake - CMake使用自定义文件的默认值扩展环境变量
- android - 将应用程序的测试版发布为生产版
- vue.js - 用axios post form symfony访问vue js数据
- sql - SQL插入语句导致奇怪的(笛卡尔积)结果
- google-apps-script - 打开卡时在 gmail 插件上发出 http 请求
- r - 连接三个数字列而不将它们添加到 r
- javascript - Puppeteer - 滚动无限页面在无头模式下不起作用