Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
使用 JavaScript 递归搜索嵌套对象并返回匹配项_创想鸟

使用 JavaScript 递归搜索嵌套对象并返回匹配项

使用 javascript 递归搜索嵌套对象并返回匹配项

本文介绍了如何使用 JavaScript 递归搜索嵌套对象,并根据给定的搜索字符串列表返回匹配的对象。通过使用生成器函数,我们可以高效地遍历对象结构,并提取所需的匹配项,同时避免返回包含匹配项的父级对象。

在处理复杂的数据结构时,经常需要从嵌套的对象中查找特定的信息。JavaScript 提供了多种方法来实现这一目标,其中递归搜索是一种常用的技术。本文将介绍如何使用递归和生成器函数来高效地搜索嵌套对象,并返回与搜索字符串列表匹配的对象。

递归搜索的实现

核心思路是使用递归函数遍历对象的每个属性,并检查属性的键是否包含在搜索列表中。如果找到匹配项,则使用 yield 关键字返回该对象。为了处理多个搜索字符串,我们将使用一个外部函数来迭代搜索列表,并对每个字符串调用递归搜索函数。

以下是实现此功能的代码:

立即学习“Java免费学习笔记(深入)”;

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);    }  }}function* search(data, values) {  for (const value of values)    yield* search1(data, value);}

代码解释:

search1(data, value): 这是一个生成器函数,它接收一个对象 data 和一个搜索字符串 value 作为参数。它递归地遍历 data 的每个属性。如果属性的键等于 value,则使用 yield 关键字返回该属性的值。否则,它将递归调用自身来搜索该属性的值。search(data, values): 这是一个生成器函数,它接收一个对象 data 和一个搜索字符串列表 values 作为参数。它迭代 values 中的每个字符串,并对每个字符串调用 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);

这将输出以下结果:

{  "tab1graph2": {    "String a": "value a",    "String b": "value b",    "String c": "value c"  }}{  "tab1graph1": {    "String a": "value a",    "String b": "value b",    "String c": "value c"  }}

使用 Array.from 收集结果

如果你需要将所有结果收集到一个数组中,可以使用 Array.from 方法:

const results = Array.from(search(data, searchList));console.log(results);

使用高阶函数和谓词

为了提高代码的灵活性,我们可以使用高阶函数和谓词来定义搜索条件。以下是一个示例:

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);    }  }}const results = Array.from(  search(    data,    ([key, value]) => searchList.includes(key)  ));console.log(results);

在这个例子中,predicate 是一个函数,它接收一个键值对作为参数,并返回一个布尔值,指示该键值对是否匹配搜索条件。

搜索顺序键

如果需要搜索顺序键(例如 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);    }  }}

然后,你可以使用以下代码来搜索顺序键:

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

总结

本文介绍了如何使用 JavaScript 递归搜索嵌套对象,并返回匹配的对象。通过使用生成器函数、高阶函数和谓词,我们可以灵活地定义搜索条件,并高效地遍历对象结构。这些技术在处理复杂的数据结构时非常有用,可以帮助你快速找到所需的信息.

以上就是使用 JavaScript 递归搜索嵌套对象并返回匹配项的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1533132.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JavaScript混入模式与多重继承
上一篇 2025年12月21日 00:19:04
JavaScript惰性求值与延迟计算模式
下一篇 2025年12月21日 00:19:19

相关推荐

发表回复

登录后才能评论
关注微信