一组(共组..)
Set of sets (of sets...)
在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()
调用并跳过与任何现有成员相等的项。您可以使用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演示。
相关文章:
- fluxxor向一个flux实例添加一组以上的操作
- 创建一个数组数组,没有任何重复的Javascript
- 我们怎样才能将内含子J用于一组特定的元素
- 根据另一个数组对数组进行排序,包括位置和字符串[ES6]
- 使用linq.js按当前日期订购一组momentjs日期
- 正则表达式,从一组关键字中获取奇数
- 创建一组元素JointJS
- 如何在javascript中获取一组复选框值
- 一组(共组..)
- 使用JS将页面中的每个字母设置为随机颜色.为什么在页面的每个打开标记之前总是有一组额外的span标记
- 在一组复选框中,一次只允许选择一个
- 为什么在fabricjs中可选择的不适用于一组圆
- 如何在不刷新页面的情况下每次单击一组选项卡时刷新视图内容窗格
- 从一组具有相同起始和结束的所有段落的段落中提取包含特定字符串的段落
- 简单的Javascript文本编辑器或一组函数
- 基于日期范围的一组日期范围内的天数
- 处理对象数组并将它们以 4 个为一组进行分配
- 如何在 Javascript 中用一组字符拆分子字符串上的字符串
- 在数组(一组整数)中找到最大的值
- JQuery的加载功能,一组一组的链接