按照多个属性(包括日期)对数组进行排序

5
我想对一个数组进行枚举名、数字、以及日期的排序。当我只按照枚举名和数字排序时,看起来没问题,但是当我将日期也添加进去后,结果出现了混乱。
以下是我的代码:
enum myType { 
  high,
  medium,
  low
}

myArray.sort((a, b) =>
  myType[a.type] - myType[b.type] ||
  a.classification - b.classification ||
  new Date(a.time) > new Date(b.time)
    ? -1
    : 1
);

然而,这似乎相反地排序了,它按照类型相反的顺序排序,先是低级别,后是高级别。我们该如何处理?

更新:日期将被传递为这样:2017-07-02T14:59:55.711Z


1
请加上日期的风格。 - Nina Scholz
1个回答

4

在不知道time的样式的情况下,您需要将三元运算符包装起来,以避免读取所有三元表达式。

myArray.sort((a, b) =>
    myType[a.type] - myType[b.type] ||
    a.classification - b.classification ||
    (new Date(a.time) > new Date(b.time)
        ? -1
        : 1)
);

使用符合 ISO 8601 标准的字符串,您可以使用 String#localeCompare 进行字符串比较。
myArray.sort((a, b) =>
    myType[a.type] - myType[b.type] ||
    a.classification - b.classification ||
    a.time.localeCompare(b.time)
);

1
太棒了!谢谢..但是为什么用三元运算符进行包装就能工作呢?我自己想不出来。 - B1B
前面的部分是三元运算式的一部分,而不是结果的一部分。 - Nina Scholz
不,这里请看一下:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table - Nina Scholz
还是不明白为什么你要用括号把三元运算符包起来 ;) - Riza Khan
@RizaKhan,请尝试不使用。 - Nina Scholz
显示剩余2条评论

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