JavaScript:找出对象内所有数组公共元素的最优高效方法
找出对象中所有数组的共同元素的最优快速方法
问题场景
给定一个包含多个数组的对象:
const x = { c: ['Full_Name', 'Last_Name', 'Email', 'Organizations', 'MISC', 'UNIQUEID'], small: ['Title', 'Organizations', 'URL', 'UNIQUEID'], // 可包含更多数组 };
需要找出所有数组中都存在的元素,示例结果为 ['Organizations', 'UNIQUEID']。
最优高效解法:统计元素出现次数
核心思路是:统计每个元素在不同数组中出现的次数,若次数等于对象中数组的总数量,说明该元素在所有数组中都存在。
代码实现
const x = { c: ['Full_Name', 'Last_Name', 'Email', 'Organizations', 'MISC', 'UNIQUEID'], small: ['Title', 'Organizations', 'URL', 'UNIQUEID'], extra: ['Age', 'Organizations', 'UNIQUEID', 'Location'] }; // 1. 统计每个元素在不同数组中的出现次数(先对单个数组去重,避免重复元素干扰) const countMap = Object.values(x).reduce((map, arr) => { const uniqueItems = new Set(arr); uniqueItems.forEach(item => { map.set(item, (map.get(item) || 0) + 1); }); return map; }, new Map()); // 2. 获取对象中数组的总数量 const totalArrayCount = Object.values(x).length; // 3. 筛选出出现次数等于数组总数的元素 const commonElements = Array.from(countMap.entries()) .filter(([_, count]) => count === totalArrayCount) .map(([item]) => item); console.log(commonElements); // 输出:['Organizations', 'UNIQUEID']
方法优势
- 时间复杂度低:仅需遍历所有数组元素一次,整体复杂度为O(N)(N为所有数组的元素总个数),比多次求交集的方法更高效。
- 鲁棒性强:自动处理单个数组内的重复元素,避免误统计。
备选方案:基准数组求交集
如果数组数量较少,也可以用第一个数组作为基准,依次与后续数组求交集:
const arrays = Object.values(x); if (arrays.length === 0) { console.log([]); return; } // 以第一个数组为基准,转成Set提升查询效率 let commonSet = new Set(arrays[0]); for (let i = 1; i < arrays.length; i++) { const currentSet = new Set(arrays[i]); // 保留两个集合的交集 commonSet = new Set([...commonSet].filter(item => currentSet.has(item))); // 交集为空时提前终止循环 if (commonSet.size === 0) break; } const commonElements = Array.from(commonSet); console.log(commonElements);
这种方法逻辑直观,但当数组数量多、元素量大时,效率不如统计次数的方法。
内容的提问来源于stack exchange,提问作者Tallion 22
相关产品推荐
相关产品推荐

