JavaScript 遍历对象查找指定的值并返回路径
问:JavaScript 如何查找对象中某个 value 并返回路径上所有的 key?
let obj = {
key1: 'str1',
key2: {
key3: 'str3'
},
key4: {
key5: {
key6: 'str6',
key7: 'str7'
},
key8: 'str8'
},
key9: 'str9'
};
有例如上面这样一个对象,要求封装一个函数,传入对象和某个 value,返回该 value 路径上的 key。比如:searchKeys(obj, "str3"),得到 "key3, key2"。—— 来源于 @zanetti 的一篇 「博问」
我本想在该「博问」下作答,但是「博客园」提示我注册尚且不满 24 小时,不允许我回答「博问」栏目的问题。好吧,我确实是 3 月 16 日晚上刚刚注册的「博客园」账号,既然无法回答那就干脆写第一篇博客。博客的申请在 3 月 17 日早上刚刚审核通过。
言归正传,这题要求遍历对象,而本质其实就是对一个多叉树进行递归。
- 封装函数并遍历对象
第一步是最简单的,不必多说。
function search(object, value) {
for (var key in object) {
// ...
}
}
- 必须先有结果
既然知道这里需要递归,那么最重要一点就是必须找到结果,因为没有最终结果的递归操作肯定会「无法自拔」。此题,当 key 对应的值等于 value 时,递归就将结束,代码如下。
if (object[key] == value) {
return [key];
} else {
}
- 然后思考递归
现在需要分析一下,如果没有找到 value,object[key] 的值有哪些情况?
1、一个不等于 value 字符串;2、一个对象。
如果是一个字符串,那么肯定是不需要任何操作,继续下一次 for ... in 循环即可。如果是一个对象,那么继续对这个对象重复刚刚的遍历操作,此处即递归。
if (typeof(object[key]) == "object") {
var temp = search(object[key], value);
}
继续分析(理论上脑子里面可以假设这是倒数第二步即可)。
假如递归的操作并没有找到 value,那么返回值是什么?我用一个 temp 变量来接收返回值,而没有找到 value 肯定就没有返回值,所以 temp 应该是 undefined。
假如递归的操作找到了 value,那么返回值是什么?对,是 key(这里我为了输出方便,使用了数组存放所有的 key)。既然得到了最后一步的 key,把他与当前的 key 放在一起即可。
if (temp == undefined) {
} else {
return [key, temp].flat();
}
这里我是用了 flat() 方法,这个方法可以抹平一个数组。不管嵌套了多少的数组,都会展开成为一个无嵌套数组。
举个例子:array = ["a", "b", ["c", "d"], ["e", ["f"]]] => array = array.flat() => array = ["a", "b", "c", "d", "e", "f"];
- 最终函数
function search(object, value) {
for (var key in object) {
if (object[key] == value) {
return [key];
} else if (typeof(object[key]) == "object") {
var temp = search(object[key], value);
if (temp == undefined) {
} else {
return [key, temp].flat();
}
} else {
}
}
}
再稍微修改一下。
function search(object, value) {
for (var key in object) {
if (object[key] == value) return [key];
if (typeof(object[key]) == "object") {
var temp = search(object[key], value);
if (temp) return [key, temp].flat();
}
}
}
至此,第一篇博客写完。我接触 JavaScript 的时间不长,也是个新手,好在这题主要是递归算法,如有错误请在评论中指出,不胜感激!
JavaScript 遍历对象查找指定的值并返回路径的更多相关文章
- javaScript遍历对象、数组总结(转载)
javaScript遍历对象.数组总结 转载来源 https://www.cnblogs.com/chenyablog/p/6477866.html 在日常工作过程中,我们对于javaScript遍 ...
- JS遍历对象的属性和值
对于需要动态获取对象的某些属性和对应的值的时候,就需要遍历对象的属性和值. const user = { name: '张三', age: 20, addr: '湖北武汉', sex: '男' } / ...
- JavaScript 遍历对象、数组总结
在日常工作过程中,我们对于javaScript遍历对象.数组的操作是十分的频繁的,今天抽空把经常用到的方法小结一下,方便今后参考使用! javaScript遍历对象总结 1.使用Objec ...
- JavaScript遍历对象-总结一
原生JavaScript 遍历 1.for 循环遍历 let array1 = ['a','b','c']; for (let i = 0;i < array1.length;i++){ con ...
- javascript遍历对象的属性
不同类型的循环 JavaScript 支持不同类型的循环: for - 多次遍历代码块 for/in - 遍历对象属性 while - 当指定条件为 true 时循环一段代码块 do/while - ...
- javaScript遍历对象、数组总结
javaScript遍历对象总结 1.使用Object.keys()遍历 返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性). var obj = {'0':'a ...
- 关于javascript遍历对象
1:遍历对象属性var obj={a:'aa',b:'bb'} for(var i in obj) { alert(i); //输出 a b } var obj={'a':'aa','b':'bb'} ...
- js中遍历对象的属性和值的方法
鉴于循环目标是个对象,length是为undefined,用map等对数组的循环方法不行,对象就用此下方法 for(var key in _this.lists.medicines){ medicin ...
- JavaScript遍历对象4种方法和遍历数组的3种方式 代码
//遍历对象 4种方法 //Object.keys(obj).forEach() console.log("keys...遍历</br>") var obj1 = { ...
随机推荐
- 20165224 陆艺杰 Exp7 网络欺诈防范
通常在什么场景下容易受到DNS spoof攻击 一样的局域网环境下 在日常生活工作中如何防范以上两攻击方法 使用攻击检查工具 简单应用SET工具建立冒名网站 打开 apache服务 apache 是 ...
- 008-数据类型(Dictionary)
数据类型(Dictionary) 一.定义 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号:分割,每个键值对之间用逗号,分割,整个字典包括在花括 ...
- 生产阶段Webpack打包【基础打包】
webpack打包 1.在根目录创建一个 webpack.config.prod.js[它其实就是在开发阶段的基础上增加点东西] 增加了 output 去除了 devServer 2.在package ...
- .netcore中无法使用System.Drawing --解决方案
问题重现: 无法正常使用 解决方法: 安装System.Drawing.Common的NuGet就能正常使用了 操作之后: 这个是.netcoe中的解决办法,.net framework解决方案中添 ...
- jdb应用
场景: 外网可以登录远程主机,但是因为安全限制,不能在外网直接访问docker应用的端口,因此不能远程调试.远程主机shell内部可以连接docker应用,也没有图形界面,没有log,考虑使用原始的j ...
- DbUtils(一) 结果集概览
记录自己对DbUtils的学习和了解 我感觉Dbutils用的最多的就是对查询结果集的处理,就以这个开始了解Dbutils库. 查看源代码发现结果集的转换主要用于query,insert, ...
- ELK(ElasticSearch, Logstash, Kibana) v5.3.2 分布式日志收集分析最佳解决方案 基于CentOS 7 ( 一 )
[root@localhost temp]# .tar.gz -C /usr/local/ [root@localhost temp]# vim logstatsh_test.conf ======= ...
- lecture-9-hashmap
1.hashmap基本操作 2.hash function,equals函数,hashCode 3.练习题 1)Two Sum Given an array of integers, return i ...
- linkedlist--lecture-4
1.链表数据结构 内存利用率高:动态分配 2.链表类定义 单向链表节点 public calss ListNode { int val =0; ListNode next = null; public ...
- 关于SQL Server数据库中的标识列
一.标识列的定义以及特点 SQL Server中的标识列又称标识符列,习惯上又叫自增列. 该种列具有以下三种特点: 1.列的数据类型为不带小数的数值类型 2.在进行插入(Insert)操作时,该列的值 ...