JS对比两个对象数组查找不匹配项返回空数组是什么问题?
问题原因分析
你提供的示例代码本身逻辑是正确的,运行后可以正常输出你预期的{label: 'Addition', type: 'address', name: 'address_4', defaultValue: 'test'}对象。如果实际运行输出空数组,通常是以下两种常见问题导致的:
- 对比顺序写反:如果你的代码实际是拿数组A过滤B中存在的项,由于A的所有元素都存在于B中,自然会返回空数组
- 匹配字段值不匹配:实际业务数据里的
name字段存在大小写差异、多余空格、类型不一致(比如字符串"4"和数字4)的情况,会导致page1.name === page2.name判断失效
优化方案
你可以改用Set存储基准值提升匹配效率,也避免逻辑写错:
仅通过name字段匹配的写法
// 先把基准数组A的所有name值存入Set const aNameSet = new Set(A.map(item => item.name)) // 过滤出B中name不在Set里的项 const difference = B.filter(item => !aNameSet.has(item.name))
需要对象所有属性完全匹配的写法
如果要求两个对象的所有属性值都一致才算匹配,可以用序列化方式判断:
const aItemSet = new Set(A.map(item => JSON.stringify(item))) const difference = B.filter(item => !aItemSet.has(JSON.stringify(item)))
内容的提问来源于stack exchange,提问作者nhatimme
相关产品推荐
相关产品推荐

