在2024年2月左右 set 相关的 api,在 tc39 的提案中标记还比标记为 stage 3, 但是近期已经标记为 stage 41。大约是 chrome 122 版本以后(截止到2024年07月04日 chrome 的版本号为 126),我们已经可以正式的用上全新的集合操作 api 了,相对应的 lodash 中的那些操作符也可以归入历史的垃圾桶了(差不多2年后)。

目前来讲已经实现的 api 有下面几个, 都很好懂,并且完全符合数学定义,我觉得有学过基本数学知识的同学都可以很简单的理解,就不多赘述,直接贴链接了:

方法返回类型数学定义示例图片
A.difference(B)Set
A.intersection(B)Set
A.symmetricDifference(B)Set
A.union(B)Set
A.isDisjointFrom(B)Boolean
A.isSubsetOf(B)Boolean
A.isSupersetOf(B)Boolean

注意

为了方便使用,实际上对于上述 api ,所接受的类型都是 set-like 类型的对象

下面是一个简单的 polyfill 实现 ,你可以通过 core-js 提供支持 2

function isSuperset(set, subset) {
  for (const elem of subset) {
    if (!set.has(elem)) {
      return false;
    }
  }
  return true;
}
 
function union(setA, setB) {
  const _union = new Set(setA);
  for (const elem of setB) {
    _union.add(elem);
  }
  return _union;
}
 
function intersection(setA, setB) {
  const _intersection = new Set();
  for (const elem of setB) {
    if (setA.has(elem)) {
      _intersection.add(elem);
    }
  }
  return _intersection;
}
 
function symmetricDifference(setA, setB) {
  const _difference = new Set(setA);
  for (const elem of setB) {
    if (_difference.has(elem)) {
      _difference.delete(elem);
    } else {
      _difference.add(elem);
    }
  }
  return _difference;
}
 
function difference(setA, setB) {
  const _difference = new Set(setA);
  for (const elem of setB) {
    _difference.delete(elem);
  }
  return _difference;
}

性能

至于性能方面,这块代码虽然是 native 的但是实际上是用TurboFan写的 js代码,速度会不会快?那肯定要比 js 实现快, 具体快多少不好说,最少会快 2x,等过段时间做个 benchmark 试一下。

脚注

  1. https://github.com/tc39/proposal-set-methods

  2. https://github.com/zloirock/core-js#new-set-methods

本文标题:js 中的新集合操作 API

永久链接:https://iceprosurface.com/code/js-new-set-operations-api/

作者授权:本文由 icepro 原创编译并授权刊载发布。

版权声明:本文使用「署名-非商业性使用-相同方式共享 4.0 国际」创作共享协议,转载或使用请遵守署名协议。

查看源码: