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

本文介绍了如何在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浏览器网页版正式地址


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