根据时间戳条件过滤数组中的唯一对象

Posted

技术标签:

【中文标题】根据时间戳条件过滤数组中的唯一对象【英文标题】:Filter unique objects in array based on timestamp condition 【发布时间】:2019-06-19 09:02:20 【问题描述】:

我有以下数组:

let arr = [
    "id": 123, "lastUpdate": 1543229793,
    "id": 456, "lastUpdate": 1545269320,
    "id": 123, "lastUpdate": 1552184795
]

我需要根据相同的 ID 过滤数组,但还要检查“lastUpdate”时间戳并只保留较新的条目。结果应该是:

[
    "id": 456, "lastUpdate": 1545269320,
    "id": 123, "lastUpdate": 1552184795
]

我尝试了以下方法:

arr = arr.filter((e, index, self) =>
    index === self.findIndex((t) => (
        t.id === intent.id && t.lastUpdate > e.lastUpdate
    ))
)

但是,这会为我过滤所有内容,结果数组为空。我认为上面&& t.lastUpdate > e.lastUpdate 的最后一部分有问题。

非常感谢任何提示!

【问题讨论】:

【参考方案1】:

您好,如果您正在寻找可以使用对象的高性能解决方案:)

let arr = ["id": 123,"lastUpdate": 1543229793,
"id": 456,"lastUpdate": 1545269320,
"id": 123, "lastUpdate": 1552184795];

let newArr = 
arr.forEach(el => 
  if(!newArr[el.id] || newArr[el.id].lastUpdate < el.lastUpdate)
      newArr[el.id] = el
  
)

console.log(Object.values(newArr));

【讨论】:

添加这个作为接受的答案,由于更好的性能。【参考方案2】:

您可以通过查找没有稍后更新的 item2 的项目来实现它

   arr.filter(item => 
                  return !arr.some(item2 => 
                  item.id === item2.id && item.lastUpdate < item2.lastUpdate)
            );

该代码的作用是:

对于数组中的每个项目,它会查看数组中是否有一个具有相同 id 的项目,其中 lastUpdate 优于它自己的。 如果有,则返回 true(Array.some 返回布尔值)。 我们否定该值并使用它进行过滤。

【讨论】:

结合否定“arr.some”和“arr.filter”的好主意!确实有效,感谢您的快速响应!【参考方案3】:

您可以通过转换为集合、排序然后获取每个 id 的第一项来逐步完成:

let arr = [
    "id": 123, "lastUpdate": 1543229793,
    "id": 456, "lastUpdate": 1545269320,
    "id": 123, "lastUpdate": 1552184795
]

// Get the ids by making a set of ids and then converting to array
let ids = [ ...new Set(arr.map((e) => e.id)) ];

// Sort the original by lastUpdate descending
arr.sort((a, b) => b.lastUpdate - a.lastUpdate);

// Get array of first item from arr by id
let res = ids.map(id => arr.find((e) => e.id == id));

console.log(res);

【讨论】:

以上是关于根据时间戳条件过滤数组中的唯一对象的主要内容,如果未能解决你的问题,请参考以下文章

javascript 根据选择条件过滤数组对象。

在Javascript中按多个条件过滤数组

如何根据使用角度 7 中的键的条件检查来过滤 json 响应中的数组

如何从 jquery 对象映射中过滤唯一的数据属性值

根据条件过滤数据框中的数据

js过滤数组中都为空的对象几种方式