使用every()检测所有对象是否含指定属性的异常问题排查
问题分析与解决
错误原因
你的代码里有两个核心问题导致every返回false:
Object.keys(source)返回的是数组:Target的Object.keys结果是['last'](数组类型),虽然单独检测时obj[0].hasOwnProperty(key)能临时工作(因为hasOwnProperty会自动将参数转为字符串,数组['last']转字符串后是'last'),但逻辑不严谨,且在every回调里的对象用错了。every回调的对象错误:回调里的obj是传入的整个数组,而不是数组中的单个元素。你应该用回调的第一个参数(数组的每一项)来调用hasOwnProperty。
修正后的代码
如果Target只有一个属性,可直接取第一个key:
function Find(obj, source) { const key = Object.keys(source)[0]; // 取出单个key字符串 const result = obj.every(item => item.hasOwnProperty(key)); console.log(result); // 输出true } // 调用测试 Find(MyObject, Target);
如果要兼容Target有多个属性的情况(检测数组中每个对象是否包含所有Target的属性),可以这样写:
function Find(obj, source) { const keys = Object.keys(source); const result = obj.every(item => { return keys.every(key => item.hasOwnProperty(key)); }); console.log(result); }
验证
调用修正后的函数,传入你的MyObject和Target,会输出预期的true——因为两个对象都拥有last属性,即使第二个对象的last值为null,也不影响属性是否存在的判断。
内容的提问来源于stack exchange,提问作者Kelee
相关产品推荐
相关产品推荐

