如何按日期升序排序对象?

10
如果我有一个对象列表:
var objectList= LIST_OF_OBJECT;
  • 列表中的每个对象都包含三个属性:“名称”,“日期”和“性别”。
  • 如何按照“日期”属性升序排列列表中的对象?
  • (“日期”属性包含类似于“2002-08-29 21:15:31+0500”的字符串值)
4个回答

30
如果您的对象中包含 日期 信息,且该信息存储在一个 字符串 字段中:
yourArray.sort(function(a, b) { return new Date(a.date) - new Date(b.date) })

或者,如果它们在日期字段内:
yourArray.sort(function(a, b) { return a.date - b.date })

2
恭喜你在这里给出了唯一明智的答案。 - Tom
1
如果它们是相同时区的有效日期字符串,则根本不需要new Date - str
对于使用TypeScript的任何人来说,这个很棒的答案只需要做一个小修改:https://dev59.com/XFkS5IYBdhLWcg3wMT2s#40248661。 - ericArbour

11

Array.sort 方法接受一个排序函数作为参数,该函数接受两个元素作为参数,并应返回:

  • < 0 如果第一个元素小于第二个元素
  • 0 如果第一个元素等于第二个元素
  • > 0 如果第一个元素大于第二个元素。

.

objectList.sort(function (a, b) {
    var key1 = a.date;
    var key2 = b.date;

    if (key1 < key2) {
        return -1;
    } else if (key1 == key2) {
        return 0;
    } else {
        return 1;
    }
});

在你提供的日期格式中,较早的日期也比使用字符串比较时的日期小,你很幸运。如果不是这种情况,你需要先将字符串转换为日期:

objectList.sort(function (a, b) {
    var key1 = new Date(a.date);
    var key2 = new Date(b.date);

    if (key1 < key2) {
        return -1;
    } else if (key1 == key2) {
        return 0;
    } else {
        return 1;
    }
});

1
我会先定义一个新字段,将每个值中已解析的日期存储起来以提高效率。 - Serabe
如果不是对象列表,而是包含对象的对象,并且我想对对象内部进行排序,怎么办? - Leem
@Leem:在任何标准中都没有描述对象成员应该按什么顺序枚举(需要引用)。您应该将对象转换为数组。 - Matt
如果date字段始终包含值"2002-08-29 21:15:31+0500"并且始终具有"+0500",则可以在不将其解析为Date对象的情况下进行比较以进行排序。 - Andrew D.

3
yourArray.sort(function(a, b) { 
 a = new Date(a.date);
 b = new Date(b.date);
 return a >b ? -1 : a < b ? 1 : 0;
})

-2
你可以尝试:
var a =[-1,0,5,4,3,2,6,1,1];
var b = totzarrange(a)
console.log(b);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接