新闻中心

在嵌套对象中查找匹配字符串列表的对象

2025-10-28
浏览次数:
返回列表

在嵌套对象中查找匹配字符串列表的对象

本文介绍了如何在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);
    }
  }
}

这个函数使用 yield 关键字,使其成为一个生成器函数。这意味着它不会一次性返回所有结果,而是每次调用 next() 方法时,返回一个结果。这在处理大型对象时,可以提高性能。

接下来,我们定义一个 search 函数,该函数接受一个对象和一个搜索值列表作为参数。它会遍历搜索值列表,并对每个值调用 search1 函数。

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

这个函数也使用了 yield* 关键字,用于委托给另一个生成器函数。这意味着 search 函数会依次产生 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"
          }
        }
      }
    }
  }
};

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

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

这段代码会输出所有键匹配 searchList 中的值的对象。

使用高阶函数和谓词

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

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);
    }
  }
}

在这个版本的 search 函数中,我们接受一个谓词函数作为参数。该函数接受一个键值对作为参数,并返回一个布尔值,指示该键值对是否应该被返回。

小爱开放平台 小爱开放平台

小米旗下小爱开放平台

小爱开放平台 291 查看详情 小爱开放平台

现在,我们可以使用这个函数来搜索我们的数据,并使用一个谓词函数来过滤结果。

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

这段代码使用 Array.from 函数将生成器函数返回的结果转换为一个数组。谓词函数 ([key, value]) => searchList.includes(key) 检查键是否在 searchList 中。

顺序键搜索

有时,我们需要查找具有特定键序列的对象。例如,我们可能需要查找 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);
    }
  }
}

在这个版本的 search1 函数中,我们接受一个路径数组作为参数。如果路径数组为空,则我们返回当前数据。否则,我们遍历对象的键,并检查当前键是否与路径数组的第一个元素匹配。如果匹配,则我们递归调用 search1 函数,并将路径数组的剩余部分作为参数。

现在,我们可以使用这个函数来搜索我们的数据,并查找具有特定键序列的对象。

function* search(data, paths) {
    for (const path of paths)
      yield* search1(data, path);
  }

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)
}

这段代码会输出所有匹配 ["test 1", "test 3a"] 或 ["test 2", "String a"] 路径的对象。

总结

本文介绍了如何使用J*aScript递归搜索嵌套对象,并返回与给定字符串列表匹配的对象。我们使用了生成器函数,以实现更高效的遍历和提取。我们还介绍了一个高阶函数,允许使用自定义谓词进行搜索。此外,我们还介绍了如何扩展该方法以支持顺序键搜索,从而可以查找具有特定键序列的对象。

注意事项:

  • 递归搜索可能会导致堆栈溢出,尤其是在处理深度嵌套的对象时。在实际应用中,需要考虑使用迭代方法或限制递归深度。
  • 性能方面,生成器函数可以提高大型对象的搜索效率,但对于小型对象,其优势可能不明显。
  • 谓词函数的使用可以极大地提高搜索的灵活性,允许根据复杂的条件进行过滤。

通过本文的学习,您应该能够掌握在J*aScript中搜索嵌套对象的有效方法,并能够根据实际需求进行定制和扩展。

以上就是在嵌套对象中查找匹配字符串列表的对象的详细内容,更多请关注其它相关文章!


# 高阶  # 台州seo外包要求  # 许昌搜狗seo网站优化推广  # 海盐网站推广  # 龙华seo推广多少钱  # 企业网站做seo推广  # seo商业策略  # 榆次网站推广  # 灞桥区视频营销推广  # 网站建设策划哪家好  # 无锡建设网站制作  # 在这个  # 象中  # 数据结构  # javascript  # 我们可以  # 这段  # 键值  # 小爱  # 遍历  # 递归  # red  # 键值对  # 堆栈溢出  # apple  #   # app  # java 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: c++ 获取系统当前时间 c++时间戳获取方法  印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】  qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决  内存疯狂猛猛涨价:主板销量直接腰斩!  Golang如何使用const iota_Go iota常量计数器讲解  Go语言中JSON数据解码与字段访问指南  Tabulator表格日期时间排序问题及自定义解决方案  《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧  为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法  J*aScript中如何高效提取对象指定属性  PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程  如何仅使用CSS更改登录界面背景图像图标的颜色  在Qt QML中通过Python字典动态更新TextEdit内容的教程  妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画  Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践  taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】  Win10桌面图标出现小盾牌怎么办 Win10去除UAC图标教程【解决】  正确连接J*aScript到HTML实现可点击图片与自定义事件处理  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  Python自定义类排序:解决lambda键值访问TypeError的实践指南  fishbowl官网免费版 fishbowl养鱼网站入口  mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析  Typer应用中灵活处理命令行参数的令牌化与解析  神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正  PHP中获取MongoDB服务器运行时间(Uptime)的专业指南  《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情  随机参数递归函数的基准调用次数与时间复杂度探究  今日头条怎么同步内容到抖音_今日头条内容同步到抖音教程  火锅吃太多会怎样 火锅吃太多会上火吗  如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略  千牛数据看板网页版_千牛数据看板网页版访问方法  12306选座怎么选到临时改签座_12306改签选座策略与步骤  Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口  《燕云十六声》两周内达九百万玩家!位居畅销榜第五  深入理解Google Cloud Datastore查询:祖先路径与数据一致性  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度  多闪网页版在线观看免费入口_多闪官网访问入口  Yandex搜索引擎一键访问入口_俄罗斯Yandex官网免登录  深入理解字体排版:Adobe光学字偶距与CSS字偶距的差异与实现  处理Kafka消费者会话超时:深入理解消息处理语义与幂等性  PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符  Node.js中HTML按钮与J*aScript函数交互的正确姿势  J*aScript类型检查_j*ascript代码规范  ArrayList与LinkedList核心操作的Big-O复杂度分析  C#中解析不规范的HTML为XML 常见的坑与解决办法  迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法  如何为你的Composer包编写自动化测试_集成PHPUnit到Composer的scripts工作流  UC浏览器官网入口2025最新 UC浏览器网页版正式地址 

搜索