如何检查两个无序数组是否包含相同数据(附JavaScript示例)
检查两个数组是否包含相同元素(不关心顺序)
你当前的代码存在问题:它是按索引位置逐个比较元素,只有当两个数组元素顺序完全一致时才会判定为相同,但你需要的是不关心排列顺序的检查逻辑——比如你给的示例里,array1和array2元素完全相同只是顺序不同,这段代码会输出"Do not contain the same data",这显然不符合你的需求。
下面提供两种简单高效的实现方式:
方法一:排序后比较(简单易实现)
先判断两个数组长度是否一致,不一致直接返回false;若长度一致,将两个数组排序后逐个比较元素是否相同。这种方法适合元素为基本类型(字符串、数字等)且数组规模不大的场景,时间复杂度为O(n log n)。
const array1 = ['foo', 'apple', 'bar']; const array2 = ['bar', 'apple', 'foo']; function arraysHaveSameElements(arr1, arr2) { if (arr1.length !== arr2.length) return false; // 先复制数组再排序,避免修改原数组 const sortedArr1 = [...arr1].sort(); const sortedArr2 = [...arr2].sort(); return sortedArr1.every((val, index) => val === sortedArr2[index]); } if (arraysHaveSameElements(array1, array2)) { console.log("包含相同的数据"); } else { console.log("不包含相同的数据"); }
方法二:哈希表统计次数(高效且支持重复元素)
用Map统计第一个数组中每个元素的出现次数,再遍历第二个数组减少对应元素的计数,若过程中遇到不存在的元素或计数为0的情况,直接返回false;最后检查所有元素的计数是否都为0。这种方法时间复杂度为O(n),效率更高,且能正确处理数组中存在重复元素的场景。
const array1 = ['foo', 'apple', 'bar', 'apple']; const array2 = ['bar', 'apple', 'foo', 'apple']; function arraysHaveSameElements(arr1, arr2) { if (arr1.length !== arr2.length) return false; const countMap = new Map(); // 统计第一个数组的元素出现次数 for (const item of arr1) { countMap.set(item, (countMap.get(item) || 0) + 1); } // 遍历第二个数组,校验并减少计数 for (const item of arr2) { const currentCount = countMap.get(item); if (!currentCount) { return false; } countMap.set(item, currentCount - 1); } // 确认所有元素计数都已清零 return Array.from(countMap.values()).every(count => count === 0); } if (arraysHaveSameElements(array1, array2)) { console.log("包含相同的数据"); } else { console.log("不包含相同的数据"); }
内容的提问来源于stack exchange,提问作者asdasf
相关产品推荐
相关产品推荐

