You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Назар Коломиец

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 12:22:58