如何简便比较结构未知的两个对象?仅校验预期属性匹配
更简洁的对象部分匹配方案
你提到的扁平化方案确实可行,但有更直接的方法来实现这种「仅校验预期属性存在且值匹配,忽略额外属性」的需求:
方法一:直接用lodash的_.isMatch
lodash本身就提供了专门做这种部分匹配的方法,完全符合你的需求——它会递归检查实际对象是否包含预期对象的所有属性(包括嵌套结构),且对应值相等,同时忽略实际对象的额外属性。
举个例子:
const expected = { "property1": "value1", "property2": "value2", "property3": { "property4": "value4" } }; // 匹配的情况 const actualMatch = { "property1": "value1", "property2": "value2", "property3": { "property4": "value4", "property5": "value5" }, "property6": "value6" }; console.log(_.isMatch(actualMatch, expected)); // 输出 true // 不匹配的情况 const actualMismatch = { "property2": "value20", "property3": { "property4": "value4" } }; console.log(_.isMatch(actualMismatch, expected)); // 输出 false
这个方法完全不用自己处理扁平化,一行代码就能搞定核心逻辑。
方法二:自己实现递归校验函数
如果不想依赖lodash,可以写一个递归函数来遍历预期对象的每个属性,逐层检查实际对象的对应属性:
function matches(expected, actual) { // 先判断基础类型的情况 if (typeof expected !== 'object' || expected === null) { return expected === actual; } // 遍历预期对象的所有键 for (const key of Object.keys(expected)) { // 如果实际对象没有这个键,直接不匹配 if (!(key in actual)) { return false; } // 递归检查嵌套对象 if (!matches(expected[key], actual[key])) { return false; } } // 所有预期属性都匹配 return true; } // 测试和上面一样的例子 console.log(matches(expected, actualMatch)); // true console.log(matches(expected, actualMismatch)); // false
这个函数会递归处理所有嵌套结构,逻辑清晰,也不需要扁平化操作,比你之前的方案更简洁。
内容的提问来源于stack exchange,提问作者user2363676
相关产品推荐
相关产品推荐

