JavaScript集合引用类型之Set

Set集合数据结构。Set很多方面像是加强的Map,这是因为它们的大多数API和行为都是共享的。

基本API

  const s = new Set();

  // 使用数组初始化集合实例
  const s1 = new Set(['val1', 'val2']);
  alert(s1.size); // 2

  // 使用自定义迭代器初始化集合
  const s2 = new Set({
    [Symbol.iterator]: function*() {
      yield 'val1';
      yield 'val2';
      yoeld 'val3';
    }
  });
  • 使用add()增加值

  • has():查询

  • size:size属性取得元素数量

  • delete():删除指定元素

  • clear():清空集合

  • add()返回集合的实例,所以可以将多个添加操作连缀起来,包括初始化。

  • 与Map类似,Set可以包含任何JavaScript数据类型作为值。集合也使用SameValueZero操作(ECMAScript内部定义,无法在语言中使用),基本上相当于使用严格对象相等的标准来检查值的匹配性。

  const s = new Set();

  const functionVal = function() {};
  const symbolVal = Symbol();
  const objectVal = new Object();

  s.add(functionVal).add(symbolVal).add(objectVal);

  s.has(functionVal); // true
  s.has(objectVal); // true
  • 与严格相等一样,用作值得对象和其他集合类型在自己得内容或属性被修改时也不会改变:
  const s = new Set();

  const objVal = {}, arrVal = [];

  s.add(objVal);
  s.add(arrVal);

  objVal.bar = "bar";
  arrVal.push("bar");
  alert(s.has(objVal)); // true
  alert(s.has(arrVal)); // true
  • add()和delete()操作都是幂等得。
    • delete()返回一个布尔值,表示集合中是否存在要删除得值:
  const s = new Set();

  s.add('foo');
  alert(s.size); // 1
  a.add('foo');
  alert(s.size); // 1

  // Set中存在要删除的值
  alert(s.delete('foo')); // true
  // 否则
  // false

顺序与迭代

  • Set会维护值插入时的顺序因此支持顺序迭代。
  • Set实例可以提供一个迭代器Iterator,能以插入顺序生成集合内容。可以通过values()方法及其别名方法keys()(或Symbol.iterator属性,它引用values())取得这个迭代器:
  const s = new Set(['val1', 'val2', 'val3']);

  alert(s.values === s[Symbol.iterator]); // true
  alert(s.keys === s[Symbol.iterator]); // true

  for (let value of s.values()) {
    alert(value)
  };

  for (let value of s[Symbol.iterator]()) {
   alert(value) 
  }
  • values()是默认迭代器,所以可以直接对集合实例使用扩展操作,把集合转换为数组:
  const s = new Set(['val1', 'val2', 'val3']);

  [...s]; // ['val1', 'val2', 'val3']
  • 集合的entries()方法返回一个迭代器,可以按照插入顺序产生包含两个元素的数组,这两个元素是集合中每个值的重复出现.
  for (let pair of s.entries()) {}
  • 使用回调函数,可以调用集合的forEach()方法并传入回调,依次迭代每个键值对。
  s.forEach((val, dupVal) => alert(`${val} -> ${dupVal}`));
  • 修改集合中值的属性不会影响其作为集合值的身份。

定义正式集合操作

  • Set与Map相似,只是API稍有调整。唯一需要强调的就是集合的API对自身的简单操作。

  • 很多开发者都喜欢使用Set操作,但需要手动实现:或者是子类化Set,或者是定义一个实用函数库。要把两种方式合二为一,可以在子类上实现静态方法,然后在实例方法中使用这些静态方法。在实现这些操作时,需要考虑几个地方。

    1. 某些Set操作是有关联性的,因此最好让实现的方法能支持处理任意多个集合实例
    2. Set保留插入顺序,所有方法返回的集合必须保证顺序。
    3. 尽可能高效地使用内存。扩展操作符的语法很简洁,但尽可能避免集合和数组间的相互转换能够节省对象初始化成本。
    4. 不要修改已有的集合实例。union(a, b)或a.union(b)应该返回包含结果的新集合实例。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JavaScript中的集合Set是一种数据结构,用于存储唯一的值。它类似于数组,但是不允许重复的值。可以使用Set的构造函数来创建一个空的集合,并使用add()方法向集合中添加元素。例如,使用let set = new Set();来创建一个空的集合,并使用set.add("A");来向集合中添加元素"A"。 Set对象还具有一些实用的方法,可以方便地进行并集、交集和差集的操作。例如,可以使用扩展运算符(...)和filter()方法来实现这些操作。通过将两个Set对象合并,可以获得并集;通过使用filter()方法和has()方法来筛选出同时在两个Set对象中存在的元素,可以获得交集;通过使用filter()方法和逻辑运算符来筛选出仅在一个Set对象中出现的元素,可以获得差集。 此外,Set对象还可以用于数组去重。可以将一个数组转换成Set对象,然后再将Set对象转换回数组,这样就可以去除数组中的重复元素。可以使用扩展运算符(...)和new Set()构造函数来实现这一点。例如,可以将一个数组arr转换成Set对象set,然后再将set转换回数组arr,这样arr中就不再包含重复的元素。 总结起来,JavaScript中的集合Set是一种用于存储唯一值的数据结构,可以通过构造函数和add()方法来创建和添加元素。可以使用扩展运算符和一些方法来实现并集、交集和差集的操作,以及数组去重的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [javascript集合Set](https://blog.csdn.net/xwj144/article/details/120939169)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [JavascriptSet集合](https://blog.csdn.net/u012043953/article/details/122476922)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值