首页 > 解决方案 > 对具有多个条件的对象数组进行排序

问题描述

可以说我有一个对象数组:

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;
});

标签: arrayssorting

解决方案


不:在你的情况下,你从

if (eventOne.date === eventTwo.date) {
  return -1;
}

如果它们具有相同eventOne的. 但是,您想要的只是检查它们是否相同;否则,按 排序。eventTwodatecodedatedate

它变得非常冗长,但你可以去:

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小于另一个,它将返回一个正数或负数(不一定是-1or 1)。

如果您真的想使用-1, 0and 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;

推荐阅读