删除javascript中基于日期字段的重复元素

删除javascript中基于日期字段的重复元素,javascript,ecmascript-6,Javascript,Ecmascript 6,我想要一个函数,它获取一个数组并过滤掉旧的重复项 特别是,如果myList中存在重复ID,则只保留具有最新日期的对象。给定以下数组 let myList = [{ id: "e9519e95-5a10-4274-ac24-de72ad60ffd7", date: "2018-02-21 21:04:13" }, { id: "026e7ecf-d236-4aff-b26d-7546ac85b7d5", date: "2018-02-22 21:04:13" },

我想要一个函数,它获取一个数组并过滤掉旧的重复项

特别是,如果myList中存在重复ID,则只保留具有最新日期的对象。给定以下数组

let myList = [{
    id: "e9519e95-5a10-4274-ac24-de72ad60ffd7",
    date: "2018-02-21 21:04:13"
},
{
    id: "026e7ecf-d236-4aff-b26d-7546ac85b7d5",
    date: "2018-02-22 21:04:13"
},
{
    id: "e9519e95-5a10-4274-ac24-de72ad60ffd7",
    date: "2018-02-23 21:04:13"
}]
该函数应返回:

[{
    id: "026e7ecf-d236-4aff-b26d-7546ac85b7d5",
    date: "2018-02-22 21:04:13"
},
{
    id: "e9519e95-5a10-4274-ac24-de72ad60ffd7",
    date: "2018-02-23 21:04:13"
}]

将条目放入由id键控的哈希表中。每次添加条目时,都要查找id,并根据最新日期保留现有条目或替换为新条目。

您可以使用函数
reduce
生成所需的输出

let myList=[{id:“e9519e95-5a10-4274-ac24-de72ad60ffd7”,日期:“2018-02-21:04:13”},{id:“026e7ecf-d236-4aff-b26d-7546ac85b7d5”,日期:“2018-02-22 21:04:13”},{id:“e9519e95-5a10-4274-ac24-de72ad60ffd7”,日期:“2018-02-23 21:04:13”};
让result=Object.values(myList.reduce((a,{id,date})=>{
if(a[id]){
如果(a[id].date,可以组合使用,从功能上过滤
数组
中基于
键的重复项

可以用来保证秩序

有关实际示例,请参见下文

//输入。
常量输入=[
{id:“e9519e95-5a10-4274-ac24-de72ad60ffd7”,日期:“2018-02-21:04:13”,
{id:“026e7ecf-d236-4aff-b26d-7546ac85b7d5”,日期:“2018-02-22 21:04:13”,
{id:“e9519e95-5a10-4274-ac24-de72ad60ffd7”,日期:“2018-02-23 21:04:13”}
]
//按日期排序。
const sortDate=array=>array.sort((A,B)=>newdate(A.Date)*1-newdate(B.Date)*1)
//过滤重复项。
const filter=array=>[…新映射(array.Map(x=>[x.id,x])).values()]
//输出。
const outputRaw=过滤器(输入)//无保证顺序。
const outputsorded=sortDate(filter(sortDate(input))//保证最新。
//证明。
console.log('Raw',outputRaw)

log('Sorted',outputsorded)
这不是最好的答案,只是对完整性的另一种理解。它不是在找到唯一集后提取值,而是在每次迭代的返回数组上工作。每次迭代中的
find
应该比键查找效率低,这也是它不是最佳答案的原因之一

让myList=[{
id:“e9519e95-5a10-4274-ac24-de72ad60ffd7”,
日期:“2018-02-21 21:04:13”
}, {
id:“026e7ecf-d236-4aff-b26d-7546ac85b7d5”,
日期:“2018-02-22 21:04:13”
}, {
id:“e9519e95-5a10-4274-ac24-de72ad60ffd7”,
日期:“2018-02-23 21:04:13”
}]
让result=myList.reduce((arr,{id,date})=>{
let found=arr.find(v=>v.id==id)
如果(找到){
如果(发现日期<日期)
found.date=日期
} 
其他的
arr.push({id,date});
返回arr;
}, []);

控制台日志(结果)太棒了!我差点就要找到答案了,但答案很难看。我在找你提供的那种优雅的东西。谢谢。为什么是@Ele?我的
原始输出
与你的
答案
输出相同。我的
排序输出
给出了实际的
输出
OP请求