首页 > web前端 > js教程 > 正文

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

碧海醫心
发布: 2025-10-28 08:47:21
原创
547人浏览过

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

本文介绍了如何在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 函数中,我们接受一个谓词函数作为参数。该函数接受一个键值对作为参数,并返回一个布尔值,指示该键值对是否应该被返回。

WowTo
WowTo

用AI建立视频知识库

WowTo 60
查看详情 WowTo

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

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中搜索嵌套对象的有效方法,并能够根据实际需求进行定制和扩展。

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

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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