有效地查找集合中的项目

时间:2019-03-09 13:42:01

标签: javascript ecmascript-6 set

如果我需要在Set中找到一个对象。该集合不包含用作索引的自然键,因此无法使用Map。有几种不同类型的谓词用于搜索Set。看来效率很低

const items = Array.from( mySet )
const found = items.find( item => someTest( item ) )

除非优化器中存在黑魔法,否则它似乎会枚举两次。我知道它公开了一个迭代器接口,但是Array.prototype.find接口比使用带有break语句的for ... of循环更简洁。

有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

您在Set上有has方法来查找值的存在。

let set = new Set([1,2,4,5,6,7])

console.log(set.has(2))
console.log(set.has(10))

答案 1 :(得分:0)

Sets实现了迭代器接口,因此您应该能够对其进行迭代以查找您的特定项目。它不会像使用带有高阶命令功能的查找那样出色和声明性,并且效率更高。 您当然可以封装该逻辑以使其变得更好

const findInSet = (pred, set) => { 
    for (let item of set) if(pred(item)) return item;
}
const item = findInSet(someTest, mySet);

答案 2 :(得分:0)

使用以ID(唯一标识符)为键的Map代替:

const items = [{ id: 1 }, { id: 2 }, { id: 3 }]
const itemsMap = new Map(items.map(o => [o.id, o]))

const item = itemsMap.get(1)

console.log(item)