按不同名称筛选最新版本的数组(javascript)

按不同名称筛选最新版本的数组(javascript),javascript,angular,typescript,Javascript,Angular,Typescript,我正试图用javascript获取每个不同名称的最新结果 与这篇文章类似,它是sql: 在javascript中最简单的方法是什么 到目前为止,我能想到的最好方法是创建一个唯一名称的数组,然后为每个名称筛选结果,按日期降序排列这些结果,然后将第一个结果推送到一个新数组中。但似乎很多 下面是一个示例阵列: [{"name": "John", "points": "400", "date": "2011-01-05"} {"name": "John", "points": "410", "date"

我正试图用javascript获取每个不同名称的最新结果

与这篇文章类似,它是sql:

在javascript中最简单的方法是什么

到目前为止,我能想到的最好方法是创建一个唯一名称的数组,然后为每个名称筛选结果,按日期降序排列这些结果,然后将第一个结果推送到一个新数组中。但似乎很多

下面是一个示例阵列:

[{"name": "John", "points": "400", "date": "2011-01-05"}
{"name": "John", "points": "410", "date": "2011-06-31"}
{"name": "Jane", points": "147", "date": "2011-09-21"}
{"name": "Jack", "points": "68", "date": "2011-07-14"}
{"name": "Jack", "points": "100", "date": "2011-10-30"}]
结果应该如下所示:

[{"name": "John", "points": "410", "date": "2011-06-31"}
{"name": "Jane", points": "147", "date": "2011-09-21"}
{"name": "Jack", "points": "100", "date": "2011-10-30"}]

您可以先按日期降序排序,然后减少为唯一:

var data = [{
        "name": "John",
        "points": "400",
        "date": "2011-01-05"
    }, {
        "name": "John",
        "points": "410",
        "date": "2011-06-31"
    }, {
        "name": "Jane",
        "points": "147",
        "date": "2011-09-21"
    }, {
        "name": "Jack",
        "points": "68",
        "date": "2011-07-14"
    }, {
        "name": "Jack",
        "points": "100",
        "date": "2011-10-30"
    }
];

data = data.sort((a, b) => new Date(b.date) - new Date(a.date));

var result = data.reduce((accum, record) => {
    if(!accum.find(entry => entry.name === record.name)){
        accum.push(record);
    }
    return accum;
}, []);

console.log(result);

如果两个条件之一匹配,则推送或替换新阵列中的对象:

  • 如果新数组中不存在项(推送)
  • 如果项目存在并且 现有项目的日期较旧(替换)
  • const数据=[
    {姓名:“约翰”,分数:“400”,日期:“2011-01-05”},
    {姓名:“约翰”,分数:“410”,日期:“2011-06-31”},
    {姓名:“简”,分:“147”,日期:“2011-09-21”},
    {姓名:“杰克”,分数:“68”,日期:“2011-07-14”},
    {姓名:“杰克”,分数:“100”,日期:“2011-10-30”}
    ];
    const latest=[];
    对于(数据项){
    const found=latest.findIndex(l=>l.name==item.name)
    如果(找到!=-1){
    如果(item.date>数据[found].date){
    最新[找到]=项;//替换
    }
    持续
    }
    最新。推送(项目);//添加新项目
    }
    
    console.log(最新版本)只需迭代列表并跟踪地图中每个名称的最新结果。如果下一个值更晚,则替换它。谢谢丹尼。那会是什么样子?