在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行为。
答案 0 :(得分:0)
那是因为在JavaScript中,只有当对象是同一个对象时才认为它们是相同的。例如{} === {}
评估为false
。
正如@torazaburo所指出的,您可以为该集合创建一个代理,该代理将捕获.add()
个调用并跳过与任何现有成员相等的项目。您可以使用lodash库中的_.isEqual()
函数来比较两组。
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。