javascript - 如何避免使用 2 个条件对 JavaScript 数组进行两次排序

标签 javascript arrays sorting underscore.js

我有一个订单数组,我需要根据 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,如果能用也ok。

示例数据(订单)

[{
  "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)

关于javascript - 如何避免使用 2 个条件对 JavaScript 数组进行两次排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60732449/

相关文章:

javascript - jQuery 和 Greensock 动画——使用类名对屏幕上的所有元素进行动画处理

c++ - 在 C++ 中使用大数组

ruby - 添加总和等于最大元素的数组元素

python - 在 Python 中合并重复项时对字典列表进行排序?

javascript - 使用javascript对堆栈元素进行排序

javascript document.createElement 函数?

javascript - 如何将图像标签的来源保存到文件中?

javascript - 仅在调用同一对象时回调

python - 如何在 Python 中对列表运行算法并将结果存储在列表中?

javascript - 按对象值对对象字典进行排序