【发布时间】:2020-03-19 14:03:56
【问题描述】:
假设我在 JavaScript 中有以下对象数组:
const requests = [
{
id: 1,
person: {
id: 1
}
},
{
id: 2,
person: {
id: 1
}
},
{
id: 3,
person: {
id: 2
}
},
{
id: 4,
person: {
id: 3
}
},
{
id: 5,
person: {
id: 2
}
}
]
我在下面写的内容将遍历数组中的每个项目,然后创建一个仅包含 person 对象的新数组。
const requestsPeopleIds = []
for (const request of requests) {
requestsPeopleIds.push(request.person.id)
}
然后我使用该新数组并使用Set 创建另一个新数组以删除重复的ids:
const uniquePeopleIds = Array.from(new Set(requestsPeopleIds))
最终结果如我所料:
console.log(uniquePeopleIds) // [1, 2, 3]
这些是提出请求的人的唯一ids。所以在5 请求中,这些请求是由3 人提出的。
必须有更有效的方法来做到这一点,所以我正在与您联系stack overflow JS 大师。
提前致谢。
【问题讨论】:
-
定义“高效”。关于 CPU 周期、内存使用…… - 除非我们谈论的是数十万个请求,或者一些非常严格的内存限制,否则这是另一种可能没有用甚至没有必要的微优化案例。
-
这几乎是你能得到的最有效的。这是一个
O(n)解决方案,最多超过输入三倍。如果您跳过制作最终数组并仅使用 Set 的迭代器,则可以减少一次迭代,并且在某些情况下可能会有一些更有效的迭代方法,但总体而言,从复杂性角度来看,它似乎和它一样好。 -
@VLAZ - 我不同意。它总是 O(n log n),因为您总是必须遍历原始数组中的每个项目,然后搜索您正在组成的唯一值集。
-
@mankowitz 但是没有搜索。添加到集合是
O(1)操作,对集合/数组的迭代是O(n)。这是在做迭代和加法,总共O(n)。 -
很抱歉误导了你。请看我更新的答案。看起来最快的解决方案可能会有所不同,并且取决于许多因素。
标签: javascript arrays unique