Как избежать необходимости дважды сортировать массив javascript с двумя условиями - PullRequest
0 голосов
/ 18 марта 2020

У меня есть массив заказов, и мне нужно отсортировать его на основе атрибута delivery_time, чтобы вначале можно было обработать самые ранние заказы. Но у нас есть возможность доставить заказ немедленно. Таким образом, независимо от времени доставки, немедленные delivery_method ордера должны быть в начале массива.

Прямо сейчас я достигаю этого с помощью 2-х функций сортировки, первая сортирует ордера на основе * 1005 атрибут * и второй сортирует массив на основе атрибута 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 
});

Я пытался сохранить оба условия в самой функции первой сортировки, но в этом случае я получаю Срочные заказы на доставку в начальной позиции каждого дня, а не в первой позиции (надеюсь, я четко объясняю это ситуация)

Как можно избежать использования двух функций для сортировки массива заказов? У меня есть подчеркивание. 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
}] 

Ответы [ 3 ]

3 голосов
/ 18 марта 2020

Итак, предполагая, что вы также хотите, чтобы 2 и 3 были после него, мы просто проверим, равны ли идентификаторы, если они - мы сортируем по дате, если нет - мы сортируем по идентификатору.

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)
1 голос
/ 18 марта 2020

Это всегда порядок объектов с delivery_method_id, равным 1, но если это верно для обоих объектов, delivery_time все еще используется для сортировки между ними. Если ни один из объектов не имеет delivery_method_id, равного 1, для сортировки используется только delivery_time.

console.log([
  {id: 1, delivery_method_id: 2, delivery_time: 1},
  {id: 2, delivery_method_id: 1, delivery_time: 2},
  {id: 3, delivery_method_id: 1, delivery_time: 2},
  {id: 4, delivery_method_id: 1, delivery_time: 1},
  {id: 5, delivery_method_id: 1, delivery_time: 2},
  {id: 6, delivery_method_id: 3, delivery_time: 7},
  {id: 7, delivery_method_id: 3, delivery_time: 8},
  {id: 8, delivery_method_id: 3, delivery_time: 6},
  {id: 9, delivery_method_id: 2, delivery_time: 6}
].sort((a, b)=>{
  return a.delivery_method_id === 1 ?
    (b.delivery_method_id === 1 ? a.delivery_time - b.delivery_time : -1) :
    (b.delivery_method_id === 1 ? 1 : a.delivery_time - b.delivery_time)
}))
0 голосов
/ 18 марта 2020

const orders = [{
  "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
}] 

orders.sort((a,b) => {
  if((a.delivery_method_id === 1 && b.delivery_method_id === 1) || (a.delivery_method_id !== 1 && b.delivery_method_id !== 1)){
    return a.delivery_time - b.delivery_time
  }
  return a.delivery_method_id === 1 ? -1 : 1
})

console.log(orders)
...