使用 J*aScript 递归搜索嵌套对象,并返回匹配特定字符串列表的对象


使用 javascript 递归搜索嵌套对象,并返回匹配特定字符串列表的对象

本文将介绍如何使用 J*aScript 递归地搜索嵌套对象,并返回匹配给定字符串列表的对象。我们将提供一个通用的解决方案,该方案使用生成器函数和递归来有效地遍历对象结构,并提取与搜索条件匹配的部分。此外,还将介绍如何使用高阶函数和谓词来实现更灵活的搜索,以及如何扩展解决方案以支持顺序键搜索。

在处理复杂的数据结构时,经常需要根据特定的条件从嵌套的对象中提取信息。本教程将演示如何使用 J*aScript 实现这一目标。我们将使用递归和生成器函数来创建一个灵活且可重用的解决方案。

基础方法:使用生成器函数和递归

首先,我们定义一个生成器函数 search1,它接受一个数据对象和一个搜索值作为输入。该函数递归地遍历数据对象,如果找到与搜索值匹配的键,则产生对应的值。

function* search1(data, value) {
  if (Object(data) === data) {
    for (const key of Object.keys(data)) {
      if (key === value)
        yield data[key];
      else
        yield* search1(data[key], value);
    }
  }
}

这个函数使用 Object.keys 来迭代对象的键。对于每个键,它检查是否与搜索值匹配。如果匹配,则使用 yield 关键字产生对应的值。如果不匹配,则递归调用 search1 函数,以继续搜索嵌套的对象。

接下来,我们定义一个 search 函数,它接受一个数据对象和一个搜索值列表作为输入。该函数使用 search1 函数来搜索每个搜索值,并将结果收集到一个数组中。

function* search(data, values) {
  for (const value of values)
    yield* search1(data, value);
}

这个函数使用 for...of 循环来迭代搜索值列表。对于每个搜索值,它调用 search1 函数,并使用 yield* 关键字将 search1 函数产生的所有值都产生出来。

以下是如何使用这些函数的一个例子:

const data = {
  "tabs-1": {
    "test 1": {
      "test 2": {
        "test 3a": {
          "tab1graph1": {
            "String a": "value a",
            "String b": "value b",
            "String c": "value c"
          }
        },
        "test 3b": {
          "tab1graph2": {
            "String a": "value a",
            "String b": "value b",
            "String c": "value c"
          }
        },
        "test 3c": {
          "tab1graph3": {
            "String a": "value a",
            "String b": "value b",
            "String c": "value c"
          }
        }
      }
    }
  }
};

const searchList = ["apple", "testx3", "test 3b", "test 3a"];

for (const result of search(data, searchList))
  console.log(result);

这段代码首先定义了一个嵌套的数据对象 data 和一个搜索值列表 searchList。然后,它调用 search 函数,并将 data 和 searchList 作为参数传递给它。最后,它使用 for...of 循环来迭代 search 函数产生的所有值,并将每个值打印到控制台。

使用高阶函数和谓词

为了使搜索更加灵活,我们可以使用高阶函数和谓词。谓词是一个返回布尔值的函数,用于测试一个值是否满足特定的条件。

以下是如何使用高阶函数和谓词来搜索嵌套对象的一个例子:

function* search(data, predicate) {
  if (Object(data) === data) {
    for (const entry of Object.entries(data)) {
      if (predicate(entry))
        yield entry[1];
      else
        yield* search(entry[1], predicate);
    }
  }
}

这个函数接受一个数据对象和一个谓词作为输入。该函数递归地遍历数据对象,并使用谓词来测试每个键值对。如果谓词返回 true,则产生对应的值。否则,递归调用 search 函数,以继续搜索嵌套的对象。

Jaaz Jaaz

开源的AI设计智能体

Jaaz 216 查看详情 Jaaz

以下是如何使用这个函数的一个例子:

const searchList = ["apple", "testx3", "test 3b", "test 3a"];

Array.from(
  search(
    data,
    ([key, value]) => searchList.includes(key)
  )
)

这段代码首先定义了一个搜索值列表 searchList。然后,它调用 search 函数,并将 data 和一个谓词作为参数传递给它。该谓词使用 searchList.includes 方法来测试每个键是否在 searchList 中。最后,它使用 Array.from 方法将 search 函数产生的所有值收集到一个数组中。

支持顺序键搜索

有时,我们需要搜索具有特定顺序的键。例如,我们可能需要查找具有键 key1,然后具有键 key2 的对象。

为了支持顺序键搜索,我们可以修改 search1 函数,使其接受一个路径数组作为输入。路径数组表示要搜索的键的顺序。

function* search1(data, path) {
  if (path.length === 0)
    yield data;
  else if (Object(data) === data) {
    for (const key of Object.keys(data)) {
      if (key === path[0])
        yield* search1(data[key], path.slice(1));
      else
        yield* search1(data[key], path);
    }
  }
}

这个函数首先检查路径数组的长度是否为 0。如果是,则表示我们已经找到了所有要搜索的键,因此我们产生当前的数据对象。否则,我们迭代数据对象的键。对于每个键,我们检查它是否与路径数组中的第一个键匹配。如果匹配,则递归调用 search1 函数,并将路径数组的其余部分作为参数传递给它。否则,我们递归调用 search1 函数,并将原始路径数组作为参数传递给它。

以下是如何使用这个函数的一个例子:

for (const result of search(data, [
  ["test 1", "test 3a"], // test 1 -> test 3a
  ["test 2", "String a"] // test 2 -> String a
]) {
  console.log(result)
}

这段代码首先定义了一个路径数组列表。每个路径数组表示要搜索的键的顺序。然后,它调用 search 函数,并将 data 和路径数组列表作为参数传递给它。最后,它使用 for...of 循环来迭代 search 函数产生的所有值,并将每个值打印到控制台。

总结

本教程介绍了如何使用 J*aScript 递归地搜索嵌套对象,并返回匹配特定字符串列表的对象。我们提供了三种不同的解决方案:

  • 使用生成器函数和递归的基础方法
  • 使用高阶函数和谓词的更灵活的方法
  • 支持顺序键搜索的方法

您可以根据您的特定需求选择最适合您的解决方案。

希望本教程对您有所帮助!

以上就是使用 J*aScript 递归搜索嵌套对象,并返回匹配特定字符串列表的对象的详细内容,更多请关注其它相关文章!


# java  # 数据结构  # 这段  # 迭代  # 遍历  # 高阶  # 给它  # 如何使用  # 递归  # red  # 键值对  # apple  # app  # javascript  # 并将  # 咸阳seo顾问  # 庄河手机优化网站  # 溧阳抖音营销推广公司电话  # 东门官网网站建设  # 家装网站怎么建设的好看  # 成考网站建设  # 宿迁推广网站价格  # 贵州网站建设资讯官网  # 全网营销推广好不好做  # 哈尔滨seo网络优化哪家好  # 您的 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 猫眼电影app怎么查询电影院的营业时间_猫眼电影影院营业时间查询教程  《米姆米姆哈》米姆获取及技能攻略  uc浏览器官网网页版使用 uc浏览器官网免费在线首页  lol小红书怎么|直播|?lol小红书|直播|是什么意思?  使用document.execCommand实现Web文本编辑器加粗/取消加粗  《微信》视频号原创声明开启方法  Excel怎么用XLOOKUP函数实现双向查找_ExcelXLOOKUP替代VLOOKUP+HLOOKUP的高级用法  PDF如何批量加注释_PDF多文件批注高亮操作教程  Flask 应用中图片动态更新与上传:实现客户端定时刷新与服务器端文件管理  Excel如何快速合并单元格内容_Excel文本合并与函数操作技巧  Win11便笺在哪打开 Win11桌面便笺(Sticky Notes)使用方法【详解】  如何测试您的网站全球打开速度-网站海外测速工  J*a中为什么强调组合优于继承_组合模式带来的灵活性与可维护性解析  铁路12306官网登录入口 铁路12306在线购票官方平台  b站如何剪辑视频_b站必剪app使用教程  优化CSS动画与J*aScript定时器协同:构建稳定Toast提示  《漫蛙manwa2》防走失网页版链接2025  J*aScript类型数组_TypedArray使用  优化Leaflet弹出层图片显示:条件渲染策略  太平年在哪个平台播出  PHP odbc_fetch_array 返回值处理:如何正确访问嵌套数组元素  雨课堂官网在线登录 网页版雨课堂登录链接  自定义你的VS Code状态栏,监控关键信息  Coolpad5890 ROM刷机包  微信步数怎么刷_微信步数快速提升技巧  CSS过渡与滚动滚动事件结合应用_scroll与transition动画  在React中正确处理HTML input type="number"的数值类型  使用逻辑应用(Logic Apps)自动处理邮件附件中的XML到Excel  c++如何掌握指针的核心用法_c++指针入门到精通指南  《兴业银行》注册登录方法  食品生产用水只要符合国家规定的生活饮用水卫生标准就可以吗  感染了幽门螺杆菌一定会导致胃癌吗?蚂蚁庄园今日答案最新11.30  QQ网站入口直接登录 QQ官方正版登录页面  《领英》查看屏蔽名单方法  Pydantic 中“schema”字段命名冲突的解决方案  《百果园》充值余额方法  电脑从睡眠中被自动唤醒怎么办_Windows唤醒源事件查看与禁用【解决】  外卖小程序对接第三方配送  《图怪兽》退出登录方法  Python实战:高效处理实时数据流中的最小/最大值  Dagster资产间数据传递与用户配置管理教程  使用Selenium在无头Chrome中交互动态菜单和复选框的策略  CDR如何复制交互式填充色  oppo手机如何通过下拉通知栏截图_oppo手机通知栏快捷截图方法  《下一站江湖2》大雪山加入方法  Mac hosts文件在哪里_Mac修改hosts文件详细教程  《咸鱼之王》新版孙坚技能解析  TikTok视频播放中断怎么办 TikTok播放异常修复方法  Lar*el 中高效执行多列更新:单次查询实现  利用Flexbox实现图片元素的二维布局:2x2网格排列指南 

 2025-10-29

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.