如何查找对象数组中某个属性的最大值



我有一个像下面这样的对象数组,

[
{
id: 1,
holiday_for: 1,
holiday_on: "2021-10-26"
},
{
id: 2,
holiday_for: 3,
holiday_on: "2021-10-26"
},
{
id: 3,
holiday_for: 1,
holiday_on: "2021-11-26"
},
{
id: 4,
holiday_for: 3,
holiday_on: "2021-11-26"
},
{
id: 5,
holiday_for: 4,
holiday_on: "2021-11-26"
}
]

,其中对象具有相同的日期但不同的holiday_for。Holiday_for有3种类型1、3、4。我正试图找到具有max holiday_for的相同日期的对象。

如果数组有2个对象具有相同的日期和类型1和3,那么3将获得高优先级。如果它有3个对象具有相同的日期,类型为1,3,4,那么4将获得优先级。

我已经尝试使用减少,但它只返回具有最高类型的对象-

const filtered = holidays.reduce((max, cur) =>
max.holiday_for > cur.holiday_for ? max : cur
)

输出类型

[

{
id: 2,
holiday_for: 3,
holiday_on: "2021-10-26"
},
{
id: 5,
holiday_for: 4,
holiday_on: "2021-11-26"
}
]
  1. Sort如果假日有相同的holiday_on,那么按降序排序holiday_for
holidays_sorted = holidays.sort((a,b)=>{
if(a.holiday_on === b.holiday_on){
return b.holiday_for - a.holiday_for
}
})
  1. Filter unique holiday_on
let unique = {};
holidays_sorted = holidays.filter(holiday=> {
if (unique[holiday.holiday_on]) {
return false;
}
unique[holiday.holiday_on] = true;
return true;
});
//keep first unique holiday_on for each date Which is the higher
{id: 2, holiday_for: 3, holiday_on: '2021-10-26'}//<--this
{id: 1, holiday_for: 1, holiday_on: '2021-10-26'}
{id: 5, holiday_for: 4, holiday_on: '2021-11-26'}//<--that
{id: 4, holiday_for: 3, holiday_on: '2021-11-26'}
{id: 3, holiday_for: 1, holiday_on: '2021-11-26'}

结果:

{id: 2, holiday_for: 3, holiday_on: '2021-10-26'}
{id: 5, holiday_for: 4, holiday_on: '2021-11-26'}

当我使用Angular时,需要添加一些类型。基于@Mehdi Taher答:我添加了一些输入,最后是这样的-

const sortedHolidays = holidays.sort(
(a: IHoliday, b: IHoliday) => {
return a.holiday_on === b.holiday_on
? b.holiday_for - a.holiday_for
: 0;
}
);
let unique: { [key: string]: IHoliday | boolean } = {};
const filtered = duplicateHolidays.filter(
(holiday: IHoliday) => {
if (unique[holiday.holiday_on]) {
return false;
}
unique[holiday.holiday_on] = true;
return true;
}
);

如果我理解正确的话,就像下面这样。

let ordered = array
.filter(a => a.holiday_on == "2021-11-26")
.sort((a, b) => b.holiday_for - a.holiday_for);
let priority = ordered[0].holiday_for;
ordered.filter(a => a.holiday_for == priority);

最新更新