Javascript 使用Angular 6中的时间戳,仅过滤对象中相同ID的最新数据

Javascript 使用Angular 6中的时间戳,仅过滤对象中相同ID的最新数据,javascript,angular,filter,Javascript,Angular,Filter,我有一个存储在“组件”变量中的对象数组 component=[{id:1,date:'20-10-2020'},{id:1,date:'13-01-2020'},{id:2,date:'30-03-2020'}] 这里我有两个“id”相同(id:1)但日期不同的对象。如果其中有多个具有相同id的对象,我只需要取出具有最新日期的id。可以用过滤器吗 过滤后,我需要输出如下 component=[{id:1,date:'20-10-2020'},{id:2,date:'30-03-2020'}]

我有一个存储在“组件”变量中的对象数组

component=[{id:1,date:'20-10-2020'},{id:1,date:'13-01-2020'},{id:2,date:'30-03-2020'}]
这里我有两个“id”相同(id:1)但日期不同的对象。如果其中有多个具有相同id的对象,我只需要取出具有最新日期的id。可以用过滤器吗

过滤后,我需要输出如下

component=[{id:1,date:'20-10-2020'},{id:2,date:'30-03-2020'}]
此处{id:1,日期:'13-01-2020'}从数组中删除


提前感谢

您可以使用以下使用地图的代码执行此操作:

let map = new Map();

component.forEach(e => {
  if (map.get(e.id) !== undefined) {     
    // current date
    const [newDay, newMonth, newYear] = e.date.split("-")
    let newDate = new Date(newYear, newMonth - 1, newDay);
    
    // previous date
    const [oldDay, oldMonth, oldYear] = map.get(e.id).split("-")
    let oldDate = new Date(oldYear, oldMonth - 1, oldDay);
    
    // compare the date and pick the latest
    map.set(e.id, newDate > oldDate ? e.date : map.get(e.id));
  } else {
    map.set(e.id, e.date);
  }
});

// clear the original contents
component = [];

// now populate it from the map
for (let e of map.entries()) {
   component.push({id: e[0], date: e[1]});
}
console.log(component);

请尝试下面的例子

我必须尽快行动,如果我身体好的话,我会对我所做的事情发表评论

const数据=[
{id:1,日期:“20-10-2020”},
{id:1,日期:“13-01-2020”},
{id:2,日期:“30-03-2020”},
];
常量输出=数据。减少((以前的值,当前值)=>{
const entity=previousValue.find((entry)=>entry.id==currentValue.id);
如果(实体!==未定义){
常数[
currentValueDate,
当前值月份,
当前值年度,
]=currentValue.date.split(“-”);
常量[entityDate,entityMonth,entityYear]=entity.date.split(“-”);
const currentValueTimestamp=新日期(
当前值年度,
currentValueMonth-1,
当前值日期
).getTime();
const entityTimestamp=新日期(
整年,
整个月-1,
实体日期
).getTime();
常量索引=previousValue.findIndex(
(条目)=>entry.id==currentValue.id
);
if(entityTimestamp>currentValueTimestamp){
上一个值[索引]=实体;
返回以前的值;
}
}
返回[…以前的值,当前值];
}, []);
控制台日志(输出)
/**
*注意,我更改了您的日期输入格式,
*因为就javascript日期对象而言,它们是无效的,
*或者你可以使用momentJS。
* 
*若你们决定利用这个时刻,那个么你们可以这样做
* 
*时刻('your date string go here')。格式('DD-MM-YYYY')
* 
*有关利用时间操纵日期的更多信息,请访问
*官方网站。
* 
* */
let component=[{id:1,日期:'10-20-2020'},{id:1,日期:'01-13-2020'},{id:2,日期:'03-30-2020'}]
函数重复数据消除(listOfObjects:Array):阵列{
让res:Array=[],
分组:{[propName:number]:数组}={};/**此处的propName将是唯一标识符的属性,例如id*/
/**首先将相似的对象分组到同一id下*/
forEach(对象=>{
如果(!groupings[object.id])groupings[object.id]=[];
分组[object.id]。推送(对象)
})
/**下一步根据“日期”属性对副本进行排序*/
for(让输入分组){
让groupingItems=groupings[key]。排序((a:any,b:any)=>{
返回新日期(a.Date)>新日期(b.Date)?1:0
});
/**现在,根据排序,从每个分组中选择第一个,因为它是最新的*/
res.push(分组项[0]);
}
返回res;
}
设res=重复数据消除(组件);
console.log('res',res)
const组件=[{
id:1,
日期:2020年10月20日
}, {
id:1,
日期:'13-01-2020'
}, {
id:2,
日期:'30-03-2020'
}];
const byLatestDate=输入=>{
const parse=date=>{
常量[日、月、年]=日期拆分(“-”);
返回新日期(年、月、日);
};
返回组件.filter(({id,date})=>id==input.id&&date!==input.date)
.every({date}=>parse(date)