比较3个数组,查找至少在其中2个及全部3个数组中存在的公共元素
实现三个数组中至少两个数组公共元素的获取方案
需求说明
现有fiveBuy、fifteenBuy、thirtyBuy三个数组,需要筛选出至少在其中两个数组中出现过的元素,三个数组共有的元素也需要包含在结果中。
方案1:基于原有嵌套逻辑调整
你原来的三重循环是判断三个元素完全相等,调整判断逻辑为只要满足任意两个相等即可,同时增加去重逻辑避免结果重复:
var buyArray = []; // 判断fiveBuy和fifteenBuy的公共元素 for (let i = 0; i < fiveBuy.length; i++) { const e = fiveBuy[i]; for (let j = 0; j < fifteenBuy.length; j++) { if (e == fifteenBuy[j] && !buyArray.includes(e)) { buyArray.push(e); } } } // 判断fiveBuy和thirtyBuy的公共元素 for (let i = 0; i < fiveBuy.length; i++) { const e = fiveBuy[i]; for (let j = 0; j < thirtyBuy.length; j++) { if (e == thirtyBuy[j] && !buyArray.includes(e)) { buyArray.push(e); } } } // 判断fifteenBuy和thirtyBuy的公共元素 for (let i = 0; i < fifteenBuy.length; i++) { const e = fifteenBuy[i]; for (let j = 0; j < thirtyBuy.length; j++) { if (e == thirtyBuy[j] && !buyArray.includes(e)) { buyArray.push(e); } } }
方案2:计数法(更高效,推荐)
嵌套循环的时间复杂度很高,当数组元素较多时性能很差,用计数统计的方式可以把时间复杂度降到O(n)级别:
// 统计每个元素在多少个独立数组中出现 const countMap = {}; // 统计fiveBuy的元素,用Set去重避免同数组内重复元素多次计数 new Set(fiveBuy).forEach(item => { countMap[item] = (countMap[item] || 0) + 1; }); // 统计fifteenBuy的元素 new Set(fifteenBuy).forEach(item => { countMap[item] = (countMap[item] || 0) + 1; }); // 统计thirtyBuy的元素 new Set(thirtyBuy).forEach(item => { countMap[item] = (countMap[item] || 0) + 1; }); // 筛选出现次数>=2的元素 // 若你的元素都是字符串类型,可以去掉map转换逻辑 const buyArray = Object.entries(countMap) .filter(([item, count]) => count >= 2) .map(([item]) => isNaN(Number(item)) ? item : Number(item));
注意:以上代码仅适用于元素为数字、字符串等基本类型的数组,如果你的元素是引用类型(对象、数组等),需要自行调整计数的key规则。
内容的提问来源于stack exchange,提问作者user16255767
相关产品推荐
相关产品推荐

