如何高效校验一个数组的所有元素是否存在于另一个数组中
数组子集校验实现方案
JavaScript 没有提供可以直接完成「判断一个数组所有元素都存在于另一个数组」的单体内置方法,但可以通过组合原生API实现,你可以根据数据规模选择对应性能的写法。
基础写法(适合百级元素以内的小规模数据)
直接组合数组的every()和includes()方法即可实现逻辑,写法最简洁:
const arr1 = ['abc', 'def'] const arr2 = ['abc', 'def', 'ghi', 'jkl'] // 校验不通过直接返回 if (!arr1.every(item => arr2.includes(item))) return // 校验通过,后续业务逻辑写在这里
注意:这个写法的时间复杂度是O(m*n)(m为arr1长度,n为arr2长度),因为
includes()每次执行都会从头到尾线性遍历arr2,数据量较大时性能会明显变差。
最优性能写法(适配任意数据规模,大数据量下优先选)
利用Set结构的O(1)时间复杂度查找特性,可以把整体时间复杂度降到O(m+n),数据量越大性能优势越明显:
const arr1 = ['abc', 'def'] const arr2 = ['abc', 'def', 'ghi', 'jkl'] // 提前剪枝:如果arr1长度比arr2还长,不可能满足包含关系,直接返回 if (arr1.length > arr2.length) return // 仅遍历一次arr2,生成用于快速查找的Set结构 const arr2Set = new Set(arr2) if (!arr1.every(item => arr2Set.has(item))) return // 校验通过,后续业务逻辑写在这里
如果arr1本身存在重复元素,可以先对arr1去重再遍历,进一步减少无效查找:
const arr2Set = new Set(arr2) if (![...new Set(arr1)].every(item => arr2Set.has(item))) return
适配说明
由于你的数组存储的都是String类型的原始值,不存在引用地址不一致导致的判断偏差,上述两种写法的判断结果都是准确的。
内容的提问来源于stack exchange,提问作者sagar verma
相关产品推荐
相关产品推荐

