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

JavaScript按关键词搜索国家对象数组返回匹配项问题求助

你代码里的核心错误
  • 多余的Object.keys调用:countries是数组,Object.keys(countries)拿到的是数组的索引字符串数组,和你要遍历国家数据的需求完全不相关
  • 属性访问错误:countries是存放所有国家的根数组,本身没有name属性,只有数组里的单个国家对象才有name字段
  • 逻辑重复混乱:你同时用了for循环和filter高阶函数,filter本身就会完成全数组遍历,不需要额外套循环,在循环里反复调用filter还会造成不必要的性能损耗
  • 筛选条件错误:filter回调里拿到的country是单个国家对象,不能直接调用字符串的includes方法,必须访问它的name属性再做匹配
  • 笔误:第二个函数调用多写了前缀s,写成scategorizeCountries会直接报未定义错误
正确实现(符合高阶函数使用要求)

你当前在学高阶函数,直接用filter实现就可以,不需要手写for循环:

const countries = [
  // 你原有的国家数据保持不变
  {
    name: 'Afghanistan',
    capital: 'Kabul',
    languages: ['Pashto', 'Uzbek', 'Turkmen'],
    population: 27657145,
    flag: 'https://restcountries.eu/data/afg.svg',
    currency: 'Afghan afghani'
  },
  {
    name: 'Åland Islands',
    capital: 'Mariehamn',
    languages: ['Swedish'],
    population: 28875,
    flag: 'https://restcountries.eu/data/ala.svg',
    currency: 'Euro'
  }
  // ...其余国家数据
]

function categorizeCountries(keyword) {
  const result = countries.filter(country => {
    // 统一转小写实现不区分大小写匹配,避免大小写导致的匹配失败
    return country.name.toLowerCase().includes(keyword.toLowerCase())
  })

  if (result.length === 0) {
    console.log('Country not found')
  }

  return result
}

// 测试调用
console.log(categorizeCountries('land')) // 会返回所有名称带land的国家,比如Åland Islands、Finland等
console.log(categorizeCountries('stan')) // 会返回所有名称带stan的国家,比如Afghanistan、Pakistan等
实现逻辑说明
  • Array.filter是JS内置的数组高阶方法,会自动遍历数组每一项,把所有满足回调判断条件(回调返回true)的元素收集起来,组成新数组返回
  • 匹配时统一将国家名、搜索关键词转为小写,不管用户输入的关键词是大写还是小写,都能正常匹配,容错性更好
  • 函数最终直接返回匹配到的结果数组,符合题目要求的返回值规则
  • 去掉了无意义的手动for循环和多余的keys获取逻辑,代码更简洁,也符合高阶函数章节的练习目标

内容的提问来源于stack exchange,提问作者ianh22

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 00:27:23