【发布时间】:2021-12-17 07:33:56
【问题描述】:
我有一大堆对象,类似于:
[
{
id: "some_id",
timestamp: 12345
},
{
id: "some_other_id",
timestamp: 12347
},
{
id: "some_id",
timestamp: 12346
},
{
id: "some_other_id",
timestamp: 12348
},
...
]
我想以某种方式对数组进行排序,数组中有对象的“部分”,具体取决于对象具有的 id。在每个部分内,对象应根据时间戳升序排序。部分本身也应根据部分的第一个时间戳进行排序。所以数组应该是这样的:
[
// section: some_id
{
id: "some_id",
timestamp: 12345
},
{
id: "some_id",
timestamp: 12348
},
// section: some_other_id, comes ofter some_id section because 12346 > 12345
{
id: "some_other_id",
timestamp: 12346
},
{
id: "some_other_id",
timestamp: 12347
},
...
]
也应该可以在函数中选择升序/降序。 现在我有这个:
elements.sort((a, b) => {
if (a.id === b.id) {
if (sortAscending) {
return a.timestamp > b.timestamp ? -1 : 1;
} else {
return a.timestamp > b.timestamp ? 1 : -1;
}
} else {
return a.id.localeCompare(b.id);
}
})
但是,这不会正确地对部分进行排序。有什么想法吗?
【问题讨论】:
-
什么不起作用?代码看起来正确
-
哦,您希望这些部分按第一个 ts 排序,而不是 id .....
-
是的,正是^^
-
您可以考虑为此使用地图,对 id 进行哈希处理。
-
这将需要两次 (O2N) 来按部分中的最低时间戳对部分进行排序,并且在每个部分中对项目进行排序,因为在您完成所有操作之前您不知道该值是什么这几项。您可以先建立一个部分索引,然后再进行一次排序,这会让您知道哪个部分应该在另一个之前。
标签: javascript node.js arrays sorting