javascript - 如何在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"},
];
所以,我想应用的优先规则是:
- 先排序“REQUEST_FLOOR”,然后再排序“CALL_DOWN”。
- 按升序对“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() 来获得相同的结果?任何帮助将不胜感激。
解决方案
您可以使用排序功能:
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"
}
]
推荐阅读
- python - 如何根据特定列对相关矩阵进行排名?
- block - 以编程方式显示块工具栏
- php - Wordpress/Woocommerce:如何在自定义位置显示“我的帐户”不同部分的内容?
- c# - 使用因属性而异的元素反序列化 XML
- java - 我需要使用一些开源 Java 库或程序将 PDF 转换为 PDF/A。有可能实现这一目标吗?
- python - 系统找不到pip
- html - 滚动到动态角度页面的正确方法
- sql - Excel 数据类型问题
- python - 在转换为 .exe 的 python 程序上使用“sys.argv”
- c++ - OpenCV DNN 无法读取 ONNX 网络