资讯动态

es-toolkit 的 isSubset:用一行代码判断数组子集关系

发布时间:2026/9/16 23:44:59 来源:尧图企业网站定制
es-toolkit 的 isSubset用一行代码判断数组子集关系【免费下载链接】es-toolkitA modern JavaScript utility library thats 2-3 times faster and up to 97% smaller, a major upgrade to lodash.项目地址: https://gitcode.com/GitHub_Trending/es/es-toolkitisSubset是 es-toolkit 数组模块中用于判断一个数组是否为另一个数组的子集的高阶工具函数。通过isSubset(superset, subset)你可以快速验证某个集合是否完整包含在另一个集合之中典型场景包括权限校验、功能开关检查、标签/角色范围校验等。读完本篇你将掌握isSubset的完整 API、边界行为空数组、重复元素、自身子集、底层实现原理以及基于自定义比较函数扩展的isSubsetWith用法。函数签名与基本语义在 源码实现 中isSubset的完整签名如下export function isSubsetT(superset: readonly T[], subset: readonly T[]): boolean { return difference(subset, superset).length 0; }参数说明参数类型说明supersetreadonly T[]上位集合数组理论上包含子集的所有元素subsetreadonly T[]待验证的候选子集数组检查其是否全部包含于superset返回值返回boolean当subset的全部元素都存在于superset中时返回true否则返回false。两个参数均声明为readonly T[]意味着isSubset不会修改任何输入数组也没有任何副作用可以放心在纯函数场景如filter回调、computed计算属性中使用。使用示例从 使用文档 中可以找到最典型的三种用法数值数组、字符串数组如权限列表以及不满足子集关系的反例。import { isSubset } from es-toolkit/array; // 数值数组判断 [2, 3, 4] 是否为 [1, 2, 3, 4, 5] 的子集 const numbers [1, 2, 3, 4, 5]; const subset [2, 3, 4]; isSubset(numbers, subset); // Returns: true // 字符串数组校验用户权限是否在允许范围内 const permissions [read, write, delete, admin]; const userPermissions [read, write]; isSubset(permissions, userPermissions); // Returns: true // 反例包含未授权元素时返回 false const colors [red, blue, green]; const invalidColors [red, yellow]; isSubset(colors, invalidColors); // Returns: false在真实项目中这种允许列表 实际值的校验模式非常常见。例如后端返回的角色列表[editor]是否属于系统定义的角色全集[viewer, editor, admin]或是用户携带的 feature flag 是否全部位于已发布的开关白名单中都可以用isSubset一行搞定。边界情况与特殊行为isSubset对以下三种特殊情况都有正确处理文档中给出了明确验证import { isSubset } from es-toolkit/array; // 空数组永远是任何数组的子集 const anyArray [1, 2, 3]; const emptyArray: number[] []; isSubset(anyArray, emptyArray); // Returns: true // 数组是其自身的子集 const same [a, b, c]; isSubset(same, same); // Returns: true // 存在重复元素时依然正常工作 const withDuplicates [1, 2, 2, 3]; const duplicateSubset [2, 2]; isSubset(withDuplicates, duplicateSubset); // Returns: true值得注意的是重复元素场景[2, 2]中的两个2在[1, 2, 2, 3]中都有对应值因此返回true。这与Set语义不同——isSubset关心的是子集中的每个元素在上位集合中都能找到匹配项而非去重后的元素集合包含关系。严格相等比较在 isSubset.spec.ts 的测试用例中有一个容易被忽略的细节const superset [1, 2, 3, 4]; const subset3 [1, 3]; expect(isSubset(superset, subset3)).toBeFalsy();由于isSubset底层基于Set的严格相等SameValueZero语义数字3与字符串3被视为不同元素因此[1, 3]不是[1, 2, 3, 4]的子集。如果业务中需要宽松比较或按对象字段比较请使用下文介绍的isSubsetWith。底层实现原理isSubset的实现只有一行核心逻辑委托给同为 es-toolkit 数组模块的 differenceexport function differenceT(firstArr: readonly T[], secondArr: readonly T[]): T[] { const secondSet new Set(secondArr); return firstArr.filter(item !secondSet.has(item)); }整个判定链路为difference(subset, superset)计算subset中那些不在superset中的元素得到缺失元素集合difference(...).length 0如果缺失元素个数为 0说明subset的全部元素都被superset覆盖判定为子集。为什么用Set实现difference将第二个数组预先转换为Set使元素是否存在的查询从O(n)降为O(1)平均情况从而让isSubset的整体时间复杂度约为O(subset.length superset.length)与嵌套includes的O(n × m)写法相比在大数组场景下有明显的性能优势。这也符合 es-toolkit 一贯的比 lodash 更小更快的设计取向。与其他数组工具的关系isSubset属于 es-toolkit 数组工具链中集合关系判定一族与之配套的还有isSubsetWith支持自定义相等比较函数实现同样只有一行——differenceWith(subset, superset, areItemsEqual).length 0difference/ differenceWith分别提供默认与自定义比较的差集计算是两者的底层依赖。它们共同在 数组模块出口 中被统一导出export { isSubset } from ./isSubset.ts; export { isSubsetWith } from ./isSubsetWith.ts;从包结构看es-toolkit 在 package.json 中通过./array: ./src/array/index.ts的 exports 映射暴露es-toolkit/array子路径因此你可以直接import { isSubset } from es-toolkit/array按需引入避免打包进无关代码。进阶用 isSubsetWith 实现自定义比较当元素是对象、或者需要大小写不敏感、数值容差等特殊比较逻辑时isSubset的严格相等就不够用了。es-toolkit 提供了对应的 isSubsetWithexport function isSubsetWithT( superset: readonly T[], subset: readonly T[], areItemsEqual: (x: T, y: T) boolean ): boolean { return differenceWith(subset, superset, areItemsEqual).length 0; }按对象字段比较import { isSubsetWith } from es-toolkit/array; const users [ { id: 1, name: john }, { id: 2, name: jane }, { id: 3, name: bob }, ]; const targetUsers [ { id: 2, name: jane }, { id: 1, name: john }, ]; isSubsetWith(users, targetUsers, (a, b) a.id b.id); // Returns: true大小写不敏感与数值容差// 不区分大小写的字符串比较 const validNames [Alice, Bob, Charlie]; const userNames [alice, BOB]; isSubsetWith(validNames, userNames, (a, b) a.toLowerCase() b.toLowerCase()); // Returns: true // 容差范围内的数值比较1.1 与 1 足够接近2.8 与 3 足够接近 const validRanges [1, 2, 3, 4, 5]; const testNumbers [1.1, 2.8]; isSubsetWith(validRanges, testNumbers, (a, b) Math.abs(a - b) 0.5); // Returns: trueareItemsEqual需要你返回一个布尔值两元素相等返回true否则返回false。其底层 differenceWith 使用firstArr.filter(...)secondArr.every(...)的双层遍历完成判定因此当数组规模较大时建议保持比较函数足够轻量。总结isSubset(superset, subset)判断subset的所有元素是否都被superset包含返回布尔值底层基于differenceSet实现时间复杂度约为O(n m)且不修改输入数组空数组恒为子集、数组是其自身的子集、重复元素可正确处理但比较是严格相等的数字3与字符串3不相等需要对象字段比较或自定义相等规则时改用isSubsetWith(superset, subset, areItemsEqual)。对于权限白名单、配置项覆盖范围、特征开关集合等包含关系校验场景isSubset与isSubsetWith提供了简洁、类型安全且高性能的解决方案。【免费下载链接】es-toolkitA modern JavaScript utility library thats 2-3 times faster and up to 97% smaller, a major upgrade to lodash.项目地址: https://gitcode.com/GitHub_Trending/es/es-toolkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价