按属性排序,然后按Javascript中的其他两个属性排序

时间:2018-09-10 11:54:51

标签: javascript sorting

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

  • id(数字)
  • isBlue(可选,是或否)
  • isRed(可选,是或否)
  • 排名(可选号码-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' }, 
]

我不知道如何“先按颜色”然后按倾斜度在每个颜色组中创建该顺序。

3 个答案:

答案 0 :(得分:1)

您的连锁从最不相关到最相关,例如:

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)

答案 1 :(得分:0)

您可以使用es6语法代替es5,这将是一个不错的选择。

var data = [{
        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'
    }
];

var obj = {
    isBlue: [],
    isRed: [],
    isNone: []
};
data.forEach(function(val, i) {
    var key = val.isBlue ? "isBlue" : val.isRed ? "isRed" : "isNone";
    obj[key].push(val);
});

function sortValue(a, b) {
    return new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime();
}
obj.isBlue = obj.isBlue.sort(sortValue);
obj.isRed = obj.isRed.sort(sortValue);
obj.isNone = obj.isNone.sort(sortValue);
var result = [].concat(obj.isBlue).concat(obj.isRed).concat(obj.isNone);

console.log(result);

答案 2 :(得分:0)

const rows = [ 
{ 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: undefined, createdAt: '2014-01-23' },  
{ id: 10,isBlue: true, isRed: false, ranking: 3, createdAt: '2012-01-23'}
 ];
 
 const sorted = rows.sort((a, b) => {
   if( a.isBlue === b.isBlue ) {
     if( a.isRed === b.isRed ) {
       if( a.ranking === b.ranking ) {
         return new Date(a.createdAt) < new Date(b.createdAt) ? -1 : 1;
       }
       return a.ranking < b.ranking ? -1 : 1;
     }
     return b.isRed < a.isRed ? -1 : 1;
   }
   return b.isBlue < a.isBlue ? -1 : 1;
 })
 
 console.log(sorted);
 
 document.write(`ids: ${sorted.map(i => i.id)}`);

相关问题