javascript - 套套(套套...)

标签 javascript set ecmascript-6

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

s, t = frozenset([1]), frozenset([1])
u = {s, t} # u == {frozenset([1])}

既然 ECMAScript 6 带来了 Set 对象,那么在 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 行为。

最佳答案

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

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

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 .

关于javascript - 套套(套套...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37081850/

相关文章:

python - 测试集合是否为子集,考虑集合中每个元素的数量(多重性)

cakephp - 如何更新一个字段 cakephp

javascript - ASP .NET MVC、DateTimePicker 和 jQuery 验证

javascript - 将 Oembed 与 Hulu 结合使用(并了解 JSONp)

javascript - 从ownerNode获取样式表对象(样式标签)

javascript - ES6 默认参数 : values not assigned properly

javascript - 获取元素指令的html结构(或模板)

javascript - jQuery MaskMoney 插件和字段类型 Decimal(SQL SERVER 表)出现问题

objective-c - 需要初始化 NSSet 吗?

javascript - 使用 ES2015 的复杂名称导入和导出