如何在JavaScript中找出嵌套数组的重复值并存储?
如何在JavaScript中找出嵌套数组中三个子数组的重复值?
假设你的嵌套数组结构是Arr = [arr1, arr2, arr3](其中arr1、arr2、arr3均为元素数组),要提取三个子数组的共同重复值(即三个数组的交集)存入Arr2,可以用以下几种方式实现:
针对固定三个子数组的实现
如果确定只有三个子数组,直接通过Set提升查找效率,再筛选交集:
// 示例输入 const arr1 = [1, 2, 3, 4, 2]; const arr2 = [2, 3, 5, 6]; const arr3 = [2, 3, 7, 8]; const Arr = [arr1, arr2, arr3]; // 将后两个子数组转为Set,优化查找速度 const set2 = new Set(Arr[1]); const set3 = new Set(Arr[2]); // 从第一个数组筛选出同时存在于另外两个数组的元素 let Arr2 = Arr[0].filter(item => set2.has(item) && set3.has(item)); // 若需确保Arr2无重复(比如第一个子数组本身有重复元素),再去重 Arr2 = [...new Set(Arr2)]; console.log(Arr2); // 输出: [2, 3]
说明
- 使用
Set的has()方法是因为它的时间复杂度为O(1),比数组的includes()更高效,适合处理大数据量的场景。 - 如果你的子数组本身已经是无重复的,可以省略最后一步去重操作。
通用化实现(支持任意数量子数组)
如果后续可能扩展子数组数量,可以写一个通用函数,通过reduce逐步求数组交集:
function findCommonElements(nestedArr) { if (nestedArr.length === 0) return []; // 以第一个数组为基准,依次和后续数组求交集 return nestedArr.reduce((commonElements, currentArr) => { const currentSet = new Set(currentArr); // 筛选出当前公共元素中存在于当前数组的项,同时去重 return [...new Set(commonElements.filter(item => currentSet.has(item)))]; }, nestedArr[0]); } // 调用示例 const Arr = [[1,2,3,4], [2,3,5,6], [2,3,7,8], [2,3,9]]; const Arr2 = findCommonElements(Arr); console.log(Arr2); // 输出: [2, 3]
处理引用类型元素(如对象)
如果子数组中的元素是对象等引用类型,需要自定义比较逻辑,因为Set默认比较引用地址:
function findCommonObjects(nestedArr, compareFn) { if (nestedArr.length === 0) return []; return nestedArr.reduce((common, currentArr) => { return common.filter(commonItem => { // 用自定义函数判断当前数组中是否存在匹配项 return currentArr.some(currentItem => compareFn(commonItem, currentItem)); }); }, nestedArr[0]); } // 示例:根据对象的id属性判断是否重复 const arr1 = [{id: 1}, {id: 2}, {id: 3}]; const arr2 = [{id: 2}, {id: 3}, {id: 4}]; const arr3 = [{id: 2}, {id: 3}, {id: 5}]; const Arr = [arr1, arr2, arr3]; const Arr2 = findCommonObjects(Arr, (a, b) => a.id === b.id); console.log(Arr2); // 输出: [{id: 2}, {id: 3}]
内容的提问来源于stack exchange,提问作者shishir chhetri
相关产品推荐
相关产品推荐

