arrays - 对具有多个条件的对象数组进行排序
问题描述
可以说我有一个对象数组:
let updatedEvents = [
{
"code": "3894",
"date": "2020-06-01T20:00:00+0300",
"timestamp": 1591030800
},
{
"code": "1976",
"date": "2020-06-01T20:00:00+0300",
"timestamp": 1591030800
},
{
"code": "0482",
"date": "2020-06-01T20:00:00+0300",
"timestamp": 1591030800
},
{
"code": "0408",
"date": "2020-06-01T20:00:00+0300",
"timestamp": 1591030800
},
];
如果我想按事件日期对它们进行排序,并且如果事件日期在任何情况下都相同,那么按代码按升序对它们进行排序,那么以下内容是否正确?:
const sortedEventsByDateUniqueCode = updatedEvents.sort((eventOne, eventTwo) => {
if (eventOne.date === eventTwo.date) {
return -1;
}
if (eventOne.code > eventTwo.code) return 1;
if (eventOne.code < eventTwo.code) return -1;
});
解决方案
不:在你的情况下,你从
if (eventOne.date === eventTwo.date) {
return -1;
}
如果它们具有相同eventOne
的. 但是,您想要的只是检查它们是否相同;否则,按 排序。eventTwo
date
code
date
date
它变得非常冗长,但你可以去:
if (eventOne.date < eventTwo.date) {
return -1;
}
if (eventOne.date > eventTwo.date) {
return 1;
}
if (eventOne.code < eventTwo.code) {
return -1;
}
if (eventOne.code > eventTwo.code) {
return 1;
}
return 0;
然而,正如我所说,这非常冗长。如果您可以使用更短的版本,那就太好了。
gorak 提供了一个简短的帮助:
return (new Date(eventOne.date) - new Date(eventTwo.date)) || (eventOne.code - eventTwo.code);
这是有效的,因为日期和字符串可以相互减去(如果两个事件codes
的长度不同,那么它可能不起作用)并且0
如果它们相等则返回。0
是假的,所以当它用于 or 表达式的左侧时||
,它的计算结果为假并返回右侧的值。但是,如果一个date
小于另一个,它将返回一个正数或负数(不一定是-1
or 1
)。
如果您真的想使用-1
, 0
and 1
,那么您可以执行以下操作:
const dateDiff = new Date(eventOne.date) - new Date(eventTwo.date);
const codeDiff = eventOne.code - eventTwo.code;
return (dateDiff / Math.abs(dateDiff)) || (codeDiff / Math.abs(codeDiff)) || 0;
推荐阅读
- gcc - 如何自动获取与复杂的“gcc”调用等效的详细脚本?
- typescript - 对于未在所有联合成员上定义的属性,访问对象类型联合中的属性失败
- jquery - 如何在 JQuery 数据表 CellEdit 上集成 Select2 插件?
- php - 如果用户单击按钮出现的区域,则 HTML 隐藏按钮仍可单击
- php - PHP是否有某种方法可以在点击图片列表时显示图片详细信息?
- html - 如何在移动版中更改 div 对齐
- javascript - 错误:未能找到与选择器匹配的元素for-loop - 如何使用已经在 for 循环中输入的数据生成平均值?
- android - 如何在键盘即将显示之前获得回调
- c++ - 如何处理不同的数组大小作为函数的参数?