分组和排序数组

时间:2019-11-28 17:09:39

标签: javascript

我有这样的来自服务器的数据

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

2 个答案:

答案 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。因此,||将检查下一个表达式,因为0falsy的值。

  • 然后,它将基于principal进行排序。您可以减去2个布尔值,因为它会基于该值返回1,-1或0。

    true - false === 1
    false - true === -1
    true - true === 0
    
  • 如果commongIdprincipal的值仍然相同,则将根据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。