我有这样的来自服务器的数据
git push
我要对其进行转换,以使课程按let value = [
{
'commongId': 1,
'principal': true,
'creationDate': '2019-11-03:40:00'
},
{
'commongId': 2,
'principal': false,
'creationDate': '2017-10-25T01:35:00'
},
{
'commongId': 2,
'principal': true,
'creationDate': '2019-05-25T08:00:00'
},
{
'commongId': 1,
'principal': false,
'creationDate': '2018-11-25T09:40:00'
},
{
'commongId': 1,
'principal': false,
'creationDate': '2017-11-25T09:40:00'
},
{
'commongId': 2,
'principal': false,
'creationDate': '2018-05-25T08:00:00'
},
]
分组,每个“ id”的主要课程应首先出现,而其余课程属于同一{{1 }}之后,按照创建日期(asc)排序该主要课程。
所以基本上输出应该是
commonId
我有一个可行的解决方案,我认为这看起来很可怕而且太复杂了。
commonId
答案 0 :(得分:2)
您可以像这样使用sort
。
const value=[{commongId:1,principal:true,creationDate:"2019-11-03:40:00"},{commongId:2,principal:false,creationDate:"2017-10-25T01:35:00"},{commongId:2,principal:true,creationDate:"2019-05-25T08:00:00"},{commongId:1,principal:false,creationDate:"2018-11-25T09:40:00"},{commongId:1,principal:false,creationDate:"2017-11-25T09:40:00"},{commongId:2,principal:false,creationDate:"2018-05-25T08:00:00"},];
value.sort((a, b) => a.commongId - b.commongId
|| b.principal - a.principal
|| a.creationDate.localeCompare(b.creationDate)
)
console.log(value)
该数组将首先根据commongId
进行排序。如果两者都具有相同的commongId
,则减法将返回0。因此,||
将检查下一个表达式,因为0
是falsy
的值。
然后,它将基于principal
进行排序。您可以减去2个布尔值,因为它会基于该值返回1,-1或0。
true - false === 1
false - true === -1
true - true === 0
如果commongId
和principal
的值仍然相同,则将根据creationDate
对数组进行排序。由于日期采用ISO格式,因此可以使用localeCompare
进行字符串比较。如果日期采用其他格式,则可以
new Date(a.creationDate) - new Date(b.creationDate)
答案 1 :(得分:0)
使用rxjs映射和lodash groupBy。
of(response).pipe(
map(response => _groupBy(moveToFirst(response, item => item.principal === true)), 'commonId')
);
moveToFirst
是一种自定义方法,用于将所需项目移至索引0。