JavaScript数组过滤工厂函数问题:为何返回空数组?
问题分析:过滤父母函数返回空数组的原因
问题场景
你有如下人员信息数组:
const people = [ { "name": "Bernardus de Causmaecker", "sex": "m", "born": 1721, "died": 1789, "father": "Lieven de Causmaecker", "mother": "Livina Haverbeke" }, { "name": "Lieven de Causmaecker", "sex": "m", "born": 1696, "died": 1724, "father": "Carel de Causmaecker", "mother": "Joanna Claes" }, { "name": "Livina Haverbeke", "sex": "f", "born": 1696, "died": 1724, "father": "Father Name 1", "mother": "Mother Name 1" } ];
你需要实现一个createIsMyParentFilter工厂函数,传入孩子的名字,返回过滤函数以找到该孩子的父母。但当前实现调用后返回空数组:
function createIsMyParentFilter(name) { return function(person) { return person.mother === name || person.father === name; }; } console.log( people.filter( createIsMyParentFilter('Bernardus de Causmaecker') ) );
错误原因
你的判断逻辑完全搞反了:
- 传入的
name是孩子的名字(比如Bernardus de Causmaecker) - 要找的父母应该是数组中
name字段等于这个孩子的father或mother的对象 - 而你现在的逻辑是判断
person的mother/father是否等于孩子的名字,这显然不符合数据结构——没有任何人的父母是Bernardus,所以返回空数组。
修正后的代码
方案一:先定位孩子记录,再匹配父母
function createIsMyParentFilter(childName) { // 先找到对应的孩子对象 const child = people.find(p => p.name === childName); if (!child) return () => false; // 返回过滤函数,匹配名字等于孩子父亲或母亲的人 return function(person) { return person.name === child.father || person.name === child.mother; }; } console.log(people.filter(createIsMyParentFilter('Bernardus de Causmaecker'))); // 会返回Lieven和Livina的对象
方案二:直接遍历判断(无需提前查找孩子)
function createIsMyParentFilter(childName) { return function(person) { // 遍历数组找孩子,判断当前person是否是其父母 const child = people.find(p => p.name === childName); return child && (person.name === child.father || person.name === child.mother); }; } console.log(people.filter(createIsMyParentFilter('Bernardus de Causmaecker')));
性能优化补充
如果需要优化性能,可以提前构建名字到对象的映射表,避免每次过滤都调用find:
// 构建名字到对象的映射 const peopleMap = new Map(people.map(p => [p.name, p])); function createIsMyParentFilter(childName) { const child = peopleMap.get(childName); if (!child) return () => false; return function(person) { return person.name === child.father || person.name === child.mother; }; }
内容的提问来源于stack exchange,提问作者Назар Коломиец
相关产品推荐
相关产品推荐

