首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >集合的集合(集合的集合...)

集合的集合(集合的集合...)
EN

Stack Overflow用户
提问于 2016-05-07 05:43:02
回答 1查看 1.5K关注 0票数 3

在Python语言中,可以通过frozenset获得一组集合

代码语言:javascript
复制
s, t = frozenset([1]), frozenset([1])
u = {s, t} # u == {frozenset([1])}

现在ECMAScript 6引入了Set对象,在JavaScript中有没有办法让一个包含其他集合的集合是唯一的,也就是说,除了一个具有相同项目的集合之外,丢弃所有的集合?

我这么问是因为这不管用:

代码语言:javascript
复制
var s = new Set([1]), t = new Set([1]);
var u = new Set([s, t]); // u == Set{Set{1}, Set{1}}

我知道Set可能会散列它所包含的其他集合的指针,这就是为什么这两个{1}看起来是不同的。我想问的是,在JavaScript中是否有一种方法可以实现上面所示的Python行为。

EN

回答 1

Stack Overflow用户

发布于 2016-05-07 17:43:27

这是因为在JavaScript中,作为对象的值只有在它们是同一个对象时才被认为是相等的。例如,{} === {}的计算结果为false

正如@torazaburo所指出的,您可以为该集合创建一个代理,该代理将捕获.add()调用并跳过与任何现有成员相等的项。您可以使用lodash库中的_.isEqual()函数来比较两个集合。

代码语言:javascript
复制
const firstSet = new Set([1])
     ,secondSet = new Set([1])

const newSet = new Set()

newSet.add = new Proxy(newSet.add, {
  apply: (target, thisArg, [value])=> {
    // Array.from() is required to use Array.prototype.some()
    if (!Array.from(newSet).some(element=> _.isEqual(element, value))) {
      target.call(newSet, value)
    }
    return target
  }
})

newSet.add(firstSet)
newSet.add(secondSet)

console.log(newSet.has(firstSet))  // logs true
console.log(newSet.has(secondSet)) // logs false, because secondSet 
                                   // has not been added, since it's a duplicate
console.log(newSet.size)           // logs 1

参见JS Bin demo

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37081850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档