根据时间戳条件过滤数组中的唯一对象
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);
【讨论】:
以上是关于根据时间戳条件过滤数组中的唯一对象的主要内容,如果未能解决你的问题,请参考以下文章