如何对比两个对象数组,筛选出arr1中stage匹配arr2的元素
数组元素跨集合按stage筛选的实现方案
需求说明
筛选数组arr1中所有stage值与数组arr2中任意元素stage值相同的元素。
原代码问题分析
你当前的实现是通过索引对应比较两个数组的stage值:
const changedObjects = Object.keys(arr1).filter(index => arr1[index].stage === arr2[index].stage).map(index => arr1[index]);
这种逻辑仅会匹配同索引位置下stage值相同的元素,无法满足“匹配arr2中任意元素stage”的需求,因此得不到所有stage为Open的元素。
正确实现方案
高效实现方式(推荐)
先提取arr2中所有stage值存入Set(查询效率为O(1)),再遍历arr1筛选符合条件的元素:
// 提取arr2中所有有效的stage值 const validStages = new Set(arr2.map(item => item.stage)); // 筛选arr1中stage存在于validStages的元素 const changedObjects = arr1.filter(item => validStages.has(item.stage));
原理说明
arr2.map(item => item.stage)生成包含arr2所有stage值的数组,再通过Set自动去重(即使有重复stage也不影响筛选逻辑)。arr1.filter(item => validStages.has(item.stage))遍历arr1的每个元素,检查其stage是否在有效集合中,符合条件的元素会被保留。
验证结果
按此代码执行后,changedObjects会包含arr1中所有stage为Open(arr2中存在该stage)和Closed Won(arr2中存在该stage)的元素,即arr1的全部5个元素。
内容的提问来源于stack exchange,提问作者USK
相关产品推荐
相关产品推荐

