0

0

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

碧海醫心

碧海醫心

发布时间:2025-10-28 08:47:21

|

558人浏览过

|

来源于php中文网

原创

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

本文介绍了如何在JavaScript中递归搜索嵌套对象,并返回与给定字符串列表匹配的对象。通过使用生成器函数,我们可以高效地遍历对象结构,并提取出满足特定条件的部分,并提供了一个高阶函数,允许使用自定义谓词进行搜索。此外,还介绍了如何扩展该方法以支持顺序键搜索,从而可以查找具有特定键序列的对象。

在处理复杂的数据结构时,经常需要在嵌套的对象中查找特定的信息。本文将介绍一种使用JavaScript实现递归搜索的方法,该方法可以根据提供的字符串列表,返回所有匹配的对象。我们将使用生成器函数,以实现更高效的遍历和提取。

使用生成器函数进行搜索

首先,我们定义一个生成器函数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 函数中,我们接受一个谓词函数作为参数。该函数接受一个键值对作为参数,并返回一个布尔值,指示该键值对是否应该被返回。

MusicLM
MusicLM

谷歌平台的AI作曲工具,用文字生成音乐

下载

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

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"] 路径的对象。

总结

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

注意事项:

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

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

463

2023.08.02

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1502

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

624

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

633

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

589

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

172

2025.07.29

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.3万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号