【发布时间】:2019-02-04 21:07:57
【问题描述】:
对于下面的array-object-thing结构:
Events : {
events : [
{
startDTG : {day: 0, month: 0, year: 0, time: "" },
endDTG : {day: 0, month: 0, year: 0, time: "" },
mode: ""
},
...
],
blah...,
blah...,
blah...
}
我正在努力寻找一种更有效的方法来根据 startDTG 键(日期时间组)对 events 对象进行排序。目前我使用以下方法,但我觉得必须有更好的方法来做到这一点!
SortEvents: function() {
this.Events.events.sort(function(a, b){return a.startDTG.time - b.startDTG.time});
this.Events.events.sort(function(a, b){return a.startDTG.day - b.startDTG.day});
this.Events.events.sort(function(a, b){return a.startDTG.month - b.startDTG.month});
this.Events.events.sort(function(a, b){return a.startDTG.year - b.startDTG.year});
},
编辑1:愿望是按Year > Month > Day > Time排序
我正处于一个关键点,我要以效率的名义放弃这个定制的 DTG。如果需要,我可以发布整个代码,但可能没有完全意义,因为它是 JS 编写的,可以在名为“Medialon”的专有控制系统中工作
编辑 2:在下方添加了一个快速制作的 JSON 代码转储,以帮助提高结构的可读性。忽略它们都是“字符串”的事实,这就是 Medialon 如何为持久性字符串化
{
"events": [
{
"startDTG": {
"day": "8",
"month": "2",
"year": "2019",
"time": "06:35",
"dayName": "5"
},
"endDTG": {
"day": "9",
"month": "2",
"year": "2019",
"time": "08:35",
"dayName": "6"
},
"mode": "1"
},
{
"startDTG": {
"day": "27",
"month": "2",
"year": "2019",
"time": "17:35",
"dayName": "3"
},
"endDTG": {
"day": "28",
"month": "2",
"year": "2019",
"time": "06:35",
"dayName": "4"
},
"mode": "1"
},
{
"startDTG": {
"day": "1",
"month": "2",
"year": "2019",
"time": "14:35",
"dayName": "5"
},
"endDTG": {
"day": "2",
"month": "2",
"year": "2019",
"time": "12:35",
"dayName": "6"
},
"mode": "1"
}
],
【问题讨论】:
-
在上面,你最终得到的只是按
year排序的事件。因此,一种更有效的方法是不进行其他排序.. :) 我假设您希望按year然后month,然后day然后time进行排序,但这不是你做的方式复合排序。 -
你能清理一下代码示例吗?很难分辨什么是数组,什么是对象。我认为您缺少一些
{}... -
您可以用
||分隔排序标准,即this.Events.events.sort(function(a, b){return a.startDTG.year- b.startDTG.year || a.startDTG.month- b.startDTG.month || ... //etc}) -
@Keith:因为现在几乎所有的排序实现都是稳定的,这将满足我们的期望:首先按年排序,然后按月排序,然后按天排序。 (时间作为字符串更成问题)。不过,这绝对不是最有效的。
-
@ScottSauyet Edge 没有稳定的排序,如果这是一个问题,Chrome 直到最近也没有。而且 ES7 并没有声明稳定的排序是必需的,所以我会非常小心地依赖这种行为。
标签: javascript arrays sorting object controls