首页 > 解决方案 > 按不同名称过滤最新的数组(javascript)

问题描述

我正在尝试在 javascript 中获取每个不同名称的最新结果。

与这篇文章类似,它是 sql: Get Latest Rates For Each Distinct Rate Name

在 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"}]

标签: javascriptangulartypescript

解决方案


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

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);

推荐阅读