首页 > 解决方案 > 如何在Javascript中通过具有多个条件的对象属性对数组进行排序

问题描述

我一直在阅读类似的已解决问题,但不明白如何在我的案例中应用它。

所以,我有一个未排序的对象数组:

const queues = [
  {"floor":2,"direction":"REQUEST_FLOOR"},
  {"floor":1,"direction":"REQUEST_FLOOR"},
  {"floor":5,"direction":"CALL_DOWN"},
  {"floor":8,"direction":"CALL_DOWN"},
  {"floor":7,"direction":"REQUEST_FLOOR"},
  {"floor":6,"direction":"CALL_DOWN"}
];

我想将其分类为:


const queues = [
  {"floor":1,"direction":"REQUEST_FLOOR"},
  {"floor":2,"direction":"REQUEST_FLOOR"},
  {"floor":7,"direction":"REQUEST_FLOOR"},
  {"floor":8,"direction":"CALL_DOWN"},
  {"floor":6,"direction":"CALL_DOWN"},
  {"floor":5,"direction":"CALL_DOWN"},
];

所以,我想应用的优先规则是:

  1. 先排序“REQUEST_FLOOR”,然后再排序“CALL_DOWN”。
  2. 按升序对“REQUEST_FLOOR”进行排序,按降序对“CALL_DOWN”进行排序。

我可以通过将它分成 2 个不同的数组来使其工作,排序,然后在最后组合它。这是我的代码:

const requestFloors = queues.filter(queue => queue.direction === "REQUEST_FLOOR");
const callDownFloors = queues.filter(queue => queue.direction === "CALL_DOWN");
requestFloors.sort((a,b) => a.floor - b.floor);
callDownFloors.sort((a,b) => b.floor - a.floor);
const newQueues = [...requestFloors,...callDownFloors];

问题:而不是过滤+排序,我想只使用sort(),所以可能是这样的: queues.sort((a,b) => b.direction.localeCompare(a.direction) || a.floor - b.floor ); 但是,这段代码正确地对方向进行了排序,但问题是它仍然对两个方向的地板进行升序排序。

如何仅使用 sort() 来获得相同的结果?任何帮助将不胜感激。

标签: javascriptarrayssortingecmascript-6

解决方案


您可以使用排序功能:

queues.sort((el1, el2) => {
     if(el1.direction ==  el2.direction){
         if(el1.direction === "REQUEST_FLOOR")
            return el1.floor - el2.floor 
         else 
            return el2.floor - el1.floor
     } 
     else if(el1.direction === "REQUEST_FLOOR") 
         return -1;
     else 
         return 1;
})

输出:

[
   {
      "floor":1,
      "direction":"REQUEST_FLOOR"
   },
   {
      "floor":2,
      "direction":"REQUEST_FLOOR"
   },
   {
      "floor":7,
      "direction":"REQUEST_FLOOR"
   },
   {
      "floor":8,
      "direction":"CALL_DOWN"
   },
   {
      "floor":6,
      "direction":"CALL_DOWN"
   },
   {
      "floor":5,
      "direction":"CALL_DOWN"
   }
]

推荐阅读