技术求助:判断两个人员对象数组是否可关联
判断两个人员数组是否可关联的解决方案
嘿,我来帮你搞定这个组件开发的瓶颈问题!首先得明确你说的“实现关联”应该是指两个数组中的人员能基于parentId建立对应关系——比如每个parentId在男性数组(Array1)和女性数组(Array2)中都有对应的人员,甚至数量匹配对吧?下面我给你梳理具体的判断逻辑和代码实现:
核心判断逻辑
要确认两个数组能否关联,关键要检查两点:
- 两个数组包含的
parentId集合完全一致(不存在某一方有、另一方没有的parentId) - 每个
parentId对应的人员数量匹配(如果需要一一对应关联的话,这一步可根据你的需求调整)
具体代码实现(以JavaScript为例)
首先我们可以写一个工具函数,把数组按parentId分组,方便后续对比:
// 将人员数组按parentId分组,返回 { parentId: [人员对象列表] } 的结构 function groupByParentId(personArray) { return personArray.reduce((grouped, person) => { const { parentId } = person; // 如果当前parentId还没分组,初始化一个空数组 if (!grouped[parentId]) { grouped[parentId] = []; } grouped[parentId].push(person); return grouped; }, {}); }
然后编写主判断函数,实现核心逻辑:
function canAssociateMaleFemaleArrays(maleArr, femaleArr) { const maleGroups = groupByParentId(maleArr); const femaleGroups = groupByParentId(femaleArr); // 提取两个数组的parentId集合,用Set避免重复 const maleParentIds = new Set(maleArr.map(p => p.parentId)); const femaleParentIds = new Set(femaleArr.map(p => p.parentId)); // 第一步:检查parentId集合是否完全一致 if (maleParentIds.size !== femaleParentIds.size) { return false; } // 遍历男性的parentId,确认每个都存在于女性数组中 for (const id of maleParentIds) { if (!femaleParentIds.has(id)) { return false; } } // 第二步:检查每个parentId对应的人员数量是否匹配(按需可选) // 如果你的关联不需要数量一致,可以删掉这部分代码 for (const parentId of maleParentIds) { if (maleGroups[parentId].length !== femaleGroups[parentId].length) { return false; } } // 所有检查通过,返回true return true; }
测试示例
用你提供的示例数据测试:
// 你的示例Array1(男性) const array1 = [ { personId: 11, sex: 'M', parentId: 1 }, { personId: 22, sex: 'M', parentId: 2 }, { personId: 33, sex: 'M', parentId: 3 } ]; // 你的示例Array2(女性) const array2 = [ { personId: 44, sex: 'F', parentId: 1 }, { personId: 55, sex: 'F', parentId: 2 }, { personId: 66, sex: 'F', parentId: 3 } ]; console.log(canAssociateMaleFemaleArrays(array1, array2)); // 输出:true // 测试Array3的场景(女性数组parentId=4有2人,男性数组只有1人) const array3 = [ { personId: 44, sex: 'F', parentId: 4 }, { personId: 55, sex: 'F', parentId: 4 } ]; const maleArrWithParent4 = [...array1, { personId: 77, sex: 'M', parentId: 4 }]; console.log(canAssociateMaleFemaleArrays(maleArrWithParent4, array3)); // 输出:false
可选调整
如果你的“关联”定义不需要数量匹配,只要存在相同的parentId即可,那直接删掉第二步的数量检查代码就行。另外,如果你的parentId是数字类型,用Set存储可以避免字符串转换的问题,比用对象键更准确。
内容的提问来源于stack exchange,提问作者Ranjit Alexander
相关产品推荐
相关产品推荐

