JavaScript中如何比较长度不同的两个数组返回布尔结果
不同长度数组的比较实现(返回布尔值)
针对你给出的两个长度不同、存在共有值的数组,根据实际判断逻辑的不同,最常用的两种场景实现如下,均做了性能优化:
场景1:判断两个数组是否存在公共元素(有交集即返回true,无交集返回false)
优先用Set存储短数组元素做查询优化,比嵌套遍历、Array.includes的性能高很多,适合任意长度的数组比较:
let array1 = [3, 1, 2, 5]; let array2 = [1, 2, 3]; function hasIntersection(arr1, arr2) { // 自动选更短的数组转Set,减少内存占用和遍历成本 const [shortArr, longArr] = arr1.length < arr2.length ? [arr1, arr2] : [arr2, arr1]; const checkSet = new Set(shortArr); return longArr.some(item => checkSet.has(item)); } // 示例中两个数组有公共值,输出true console.log(hasIntersection(array1, array2));
场景2:判断短数组是否为长数组的子集(短数组所有值都在长数组中存在即返回true,否则返回false)
同样用Set优化查询效率:
let array1 = [3, 1, 2, 5]; let array2 = [1, 2, 3]; function isSubset(childArr, parentArr) { const parentSet = new Set(parentArr); return childArr.every(item => parentSet.has(item)); } // 示例中array2的所有元素都在array1中存在,输出true console.log(isSubset(array2, array1)); // 反过来判断array1是否为array2的子集,因为元素5不在array2中,输出false console.log(isSubset(array1, array2));
注意事项
- 以上实现仅适用于数组元素为基本类型(数字、字符串、布尔值、null、undefined、Symbol)的场景,如果数组存储的是对象、数组这类引用类型值,需要先自定义值的比对规则再判断。
- 尽量避免写嵌套
for循环+includes的比对逻辑,这类写法时间复杂度为O(m*n),数组数据量大时性能会明显下降,基于Set的实现时间复杂度仅为O(m+n)。
内容的提问来源于stack exchange,提问作者Yixbro
相关产品推荐
相关产品推荐

