首页 > 解决方案 > 如何避免必须对具有 2 个条件的 javascript 数组进行两次排序

问题描述

我有一个订单数组,我需要根据delivery_time属性对其进行排序,以便可以首先处理最早的订单。但我们也可以选择立即交付订单。因此,无论交货时间如何,即时delivery_method订单都需要位于数组的开头。

现在我通过使用 2 个排序函数来实现这一点,第一个基于delivery_time属性对订单进行排序,第二个基于属性对数组进行排序delivery_method_iddelivery_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
}] 

标签: javascriptarrayssortingunderscore.js

解决方案


因此,假设您还希望 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)


推荐阅读