FOR循环内嵌套IF仅对首个元素生效的技术问题求助
解决遍历对象数组只检查第一个元素的问题
嘿,我猜你遇到的问题是函数里提前触发了return,导致遍历到第一个对象就直接结束了,根本没去检查数组里剩下的19个元素对吧?这就是为什么你只能得到第一个匹配的结果,而不是所有符合条件的属性值数组。
先看看常见的错误写法(你可能是这么写的)
比如下面这种,遍历的时候找到第一个符合条件的就直接return,函数直接终止:
function getTargetProperty(people, targetName, prop) { for (let person of people) { if (person.firstName === targetName && prop in person) { return person[prop]; // 这里一找到就返回,后面的元素都没机会被检查! } } }
或者用find方法,它本身就只返回第一个匹配的对象,自然也只能拿到一个属性值:
function getTargetProperty(people, targetName, prop) { const match = people.find(p => p.firstName === targetName); return match ? match[prop] : undefined; }
正确的写法:收集所有符合条件的结果
我们需要遍历整个数组,把所有匹配firstName且包含指定属性的对象的属性值都收集起来,最后返回这个数组。这里有两种常用的写法:
方法1:用filter + map组合
先筛选出所有符合条件的对象,再提取它们的属性值:
function getTargetProperties(people, targetName, prop) { // 筛选:找到所有firstName匹配且自身拥有指定属性的对象 const matchedPersons = people.filter(person => { return person.firstName === targetName && Object.prototype.hasOwnProperty.call(person, prop); }); // 提取属性值 return matchedPersons.map(person => person[prop]); }
方法2:用reduce一步完成
用reduce来累加符合条件的属性值,代码更紧凑:
function getTargetProperties(people, targetName, prop) { return people.reduce((resultArray, person) => { // 检查条件:名字匹配且拥有该属性 if (person.firstName === targetName && prop in person) { resultArray.push(person[prop]); } return resultArray; }, []); // 初始值是空数组,用来存结果 }
验证一下效果
假设你的people数组是这样的:
const people = [ { firstName: "John", trait: "strong" }, { firstName: "Jane", age: 28 }, { firstName: "John", trait: "quick" }, { firstName: "John", trait: "stupid" }, { firstName: "Mike", hobby: "gaming" } ];
调用getTargetProperties(people, "John", "trait"),就会返回你预期的["strong", "quick", "stupid"]啦!
小提示
如果要严格确保属性是对象自身的(不是从原型链继承来的),推荐用Object.prototype.hasOwnProperty.call(person, prop)代替prop in person,后者会把继承的属性也算进去。
内容的提问来源于stack exchange,提问作者muszynov
相关产品推荐
相关产品推荐

