我有一个对象数组,每个对象都具有以下属性:
我希望能够对这些数组中的对象进行排序,以便它们首先显示为蓝色的对象,然后显示为红色的对象,最后显示为非蓝色或红色的对象。然后,在每个颜色的“类别”中,我要按排名排序,然后按升序创建(最旧出现在最前面)。
所以,我要蓝第一,然后是红色,最后是其他颜色。但是,对于每种颜色,我想通过倾斜进行排序并在处创建。
输入示例:
[
{ 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' },
]
我不知道如何“先按颜色”然后按倾斜度在每个颜色组中创建该顺序。
答案 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)}`);