使用 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准妈咪徽章领取方法  谷歌学术论文搜索引擎 谷歌学术官网入口论坛永久链接  123平台官方登录入口 123邮箱网页端在线沟通工具  优化响应式标题底部边框:CSS实现技巧与最佳实践  包子漫画官网链接官方地址 包子漫画在线观看官网首页入口  QQ邮箱PC端登录页面_QQ邮箱网页版登录界面  如何在CSS中使用伪类:valid实现表单验证提示_结合:valid改变边框颜色  C++ cast类型转换总结_C++ reinterpret_cast与const_cast的使用  VS Code快捷键when上下文子句的妙用  芒果TV官网登录入口 芒果TV官方网站登录入口  QQ邮箱官方登录页_腾讯出品安全稳定的邮箱服务  123网页端官方登录页 123邮箱网页版即时通讯服务  OTT月报 | 2025年9月智能电视大数据报告  Python中对象引用与链表属性赋值的机制解析  《全民k歌》网页版最新登录入口一览  抖音官网入口快速访问 抖音网页版账号注册解析  TikTok网页版实时观看入口 TikTok网页版短视频在线浏览  狙击外星人小游戏在线链接_狙击外星人小游戏网页链接  告别阻塞等待:如何使用GuzzlePromises优雅处理PHP异步操作,提升应用响应速度  b站怎么查看视频的码率_b站视频码率查看方法  在Django中动态检查模型关联:一种灵活的解决方案  PyEZ 配置提交中 RpcTimeoutError 的健壮性处理策略  原子笔记app误删找回教程  蛙漫2(台版)正版官网 2025免费网页版分享  Fedora怎么安装 Fedora Workstation安装步骤  windows server2019显卡驱动怎么安装_winserver2019显卡驱动安装与远程桌面优化  mysql中如何配置字符集和排序规则_mysql字符集排序配置  《爱南宁》认证电动车方法  Symfony路由参数转换器:实体存在性验证与错误处理策略  咸鱼怎么设置仅粉丝可见的动态_咸鱼动态粉丝可见设置方法  12306APP选座怎么选充电位置_12306APP带充电插座座位选择方法与技巧  《米姆米姆哈》米姆获取及技能攻略  江苏大剧院会员卡购买步骤  PDF如何批量加注释_PDF多文件批注高亮操作教程  优化2xN网格最大路径和的动态规划算法实践  米侠浏览器插件无法启用怎么办 米侠浏览器扩展兼容性修复  win11如何开启单声道音频 Win11为听障用户合并左右声道【辅助】  《火花chat》搜索好友方法  智学网app怎么登录忘记密码_智学网app忘记密码找回与重新登录操作方法  酷狗音乐多音轨设置教程  TikTok视频播放中断怎么办 TikTok播放异常修复方法  mysql如何限制远程访问_mysql远程访问限制方法  CSS绝对定位与溢出控制:实现背景元素局部显示不触发滚动条  电脑双系统如何安装和卸载 Windows和Linux双系统安装教程【详解】  《饿了么》拼好饭点外卖教程2025  如何编写一个符合 composer 规范的 post-install-cmd 脚本?  个人所得税办理入口 个人所得税综合所得年度汇算入口  告别繁琐SEO!如何使用SyliusSitemap插件自动化生成网站地图,提升搜索引擎排名  从J*a应用程序中导出MySQL表数据的技术指南  微信网页版在线登录 微信网页版在线使用入口 

 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.