javascript - 如何在 Javascript (ECMAScript 6) 中确定 Set 是否包含没有引用的对象(动态添加到集合中)

标签 javascript ecmascript-6

好吧,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/

相关文章:

java - 在javascript下使用表达式语言?

javascript - ES6 解构日期

javascript - Typescript 中的抽象内部类

javascript - ES6 可迭代的约定?

php - 防止从读卡器提交表格

javascript - 加载时jquery加载

php - 停止表单提交?

javascript - angularjs - 选择的 ng-model 索引

javascript - 使用 private 时,Typescript 类无法访问

javascript - 如何在 Javascript/Lodash/ES6 中搜索父对象和子对象?