好吧,ECMAScript 6
Set 允许将对象添加到集合中。
喜欢
var s = new Set();
var o = {a: 1, b: 2};
s.add(o);
s.add("c");
确定是否存在“标量”元素(如 c)很简单:
s.has("c"); // true
如果对象元素相同呢?我认为为对象的 toString()
值提供 has() 会返回 true,但它不会
o.toString() // -> "[object Object]"
s.has("[object Object]") // -> false
如果 Sets 可以包含对象,那么它的 has()
必须知道确定是否包含给定的对象。但是如何呢?
更新:虽然上面描述的场景的解决方案也很直接 (s.has(o)
),但是即时向 s 添加一个您没有引用的对象?在这种情况下,您仍然可以确定 s
是否包含该对象吗?
最佳答案
你可以直接使用对象,没有绒毛:
s.has(o);
这将返回 true。
这是可行的,因为 s
Set 持有对 o
对象的引用,所以它的 has 函数只需要检查传入的对象的引用,由集合持有。
没有“丢失”引用的对象
如果你添加一个像这样的对象字面量
var s = new Set();
s.add({a: 1, b: 2});
console.log(s.has({a: 1, b: 2}));
这会导致 false
,因为这两个对象具有相同的内容,但它们完全是不同的对象。如果您想测试该集合是否包含一个具有特定内容的对象,那么您必须为此编写自己的代码。最简单的算法是:
- 遍历集合中的所有元素
- 如果内容相同→
返回true
- 如果内容相同→
- 如果我们没有返回 →
返回 false
关于javascript - 如何在 Javascript (ECMAScript 6) 中确定 Set 是否包含没有引用的对象(动态添加到集合中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31852335/