javascript - 在 Javascript 中按属性排序,然后按其他两个属性排序

标签 javascript sorting

我有一个对象数组,每个对象都具有以下属性:

  • id(数字)
  • isBlue(可选 true 或 false)
  • isRed(可选 true 或 false)
  • 排名(可选数字 - 1 比 2 更优先 -)
  • createdAt(日期,字符串格式“2012-02-01”)

我希望能够对这些数组中的对象进行排序,以便它们首先出现蓝色的对象,然后出现红色的对象,最后出现非蓝色或红色的对象。然后,在按颜色的每个“类别”中,我想按排名排序,然后按升序创建(最旧的首先出现)。

所以,我首先想要蓝色,其次是红色,最后是其他颜色。但对于每种颜色,我想通过耙子订购并创建。

输入示例:

[ 
{ id: 5, isBlue: false, isRed: true, ranking: 3, createdAt:
'2010-01-20' }, 
{ id: 3, isBlue: false, isRed: true, ranking: 3,
createdAt: '2010-01-23' }, 
{ id: 2, isBlue: false, isRed: true,
ranking: 2, createdAt: '2012-01-23' }, 
{ id: 16, isBlue: false, isRed:
false, ranking: 1, createdAt: '2014-01-23' }, 
{ id: 1, isBlue: true,
isRed: false, ranking: null, createdAt: '2014-01-23' },  
{ id: 10,isBlue: true, isRed: false, ranking: 3, createdAt: '2012-01-23'}
 ]

预期输出为:

[
 { id: 10,isBlue: true, isRed: false, ranking: 3, createdAt: '2012-01-23'},
 { id: 1, isBlue: true,
isRed: false, ranking: null, createdAt: '2014-01-23' },
{ id: 2, isBlue: false, isRed: true,
ranking: 2, createdAt: '2012-01-23' },
{ id: 5, isBlue: false, isRed: true, ranking: 3, createdAt:
'2010-01-20' },
{ id: 3, isBlue: false, isRed: true, ranking: 3,
createdAt: '2010-01-23' }, 
{ id: 16, isBlue: false, isRed:
false, ranking: 1, createdAt: '2014-01-23' }, 
]

我不知道如何“先按颜色”执行此订单,然后在每个颜色组中进行倾斜和创建。

最佳答案

您从最不相关到最相关进行链式排序,例如:

var arr = [{ id: 5, isBlue: false, isRed: true, ranking: 3, createdAt:'2010-01-20' }, 
{ id: 3, isBlue: false, isRed: true, ranking: 3, createdAt: '2010-01-23' }, 
{ id: 2, isBlue: false, isRed: true, ranking: 2, createdAt: '2012-01-23' }, 
{ id: 16, isBlue: false, isRed:false, ranking: 1, createdAt: '2014-01-23' }, 
{ id: 1, isBlue: true, isRed: false, ranking: null, createdAt: '2014-01-23' },  
{ id: 10,isBlue: true, isRed: false, ranking: 3, createdAt: '2012-01-23'} ];


    arr.sort((a,b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime())
    .sort((a,b) => (b.ranking || 0) - (a.ranking || 0))
    .sort((a,b) => (a.isRed === b.isRed) ? 0 : a.isRed ? -1 : 1)
    .sort((a,b) => (a.isBlue === b.isBlue) ? 0 : a.isBlue ? -1 : 1);
    
    console.log(arr)

关于javascript - 在 Javascript 中按属性排序,然后按其他两个属性排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52257242/

相关文章:

javascript - 是否可以进行 3 向切换?

javascript - 通过 Javascript 错误将考试时间设置为 30 分钟?

c# - 直接降序排列

Javascript - 根据对象值对对象数组进行排序

javascript - 从大量选项中选择

javascript - 想了解为什么我的代码中的这个 "setInterval"不起作用?

Java Custom Sort Order Round Robin-ish 排序

jquery - 按字母顺序排列的列表向下而不是交叉?

Javascript,计算有多少文件附加到文件上传输入

c# - .NET 4.0 - Directory.GetFiles 的结果是否始终保证按文件名排序?