问: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 的时间不长,也是个新手,好在这题主要是递归算法,如有错误请在评论中指出,不胜感激!

查看java返回的值,JavaScript 遍历对象查找指定的值并返回路径相关推荐

  1. javascript 遍历对象

    javascript 遍历对象 <!DOCTYPE html> <html lang="en"><head><meta charset=& ...

  2. jquery操作select下拉框的各种方法,获取选中项的值或文本,根据指定的值或文本选中select的option项等...

    简介jquery里对select进行各种操作的方法,如联动.取值.根据值或文本来选中指定的select下拉框指定的option选项,读取select选中项的值和文本等. 这一章,站长总结一下jquer ...

  3. java如何遍历对象里所有的值

    前端可以直接获取对象的属性,进行循环,但是java后端只能获取对象,无法对对象属性里的值进行循环 可以使用对象的反射,获取对象属性的值和属性名,也就是对象的字段名 具体实现如下: Field[] fi ...

  4. vue 取数组第一个值_vue遍历对象中的数组取值示例

    前几天小项目,没考虑周全,让后端改接口,改成数组中包含对象中包含数组的形式,后来越琢磨越不对,后台把所有数据放在了一个对象里,我拿弹窗数据不好拿,索性又改了回来,把后端折腾够呛,自己也折腾够呛,发上来 ...

  5. 关于javascript遍历对象

    1:遍历对象属性var obj={a:'aa',b:'bb'} for(var i in obj) {alert(i); //输出 a b } var obj={'a':'aa','b':'bb'} ...

  6. javascript遍历对象的属性

    不同类型的循环 JavaScript 支持不同类型的循环: for - 多次遍历代码块 for/in - 遍历对象属性 while - 当指定条件为 true 时循环一段代码块 do/while - ...

  7. Javascript 遍历对象的四种方法

    方法一: for - in 循环遍历对象自身的和继承的可枚举属性 (循环遍历对象自身的和继承的可枚举属性(不含Symbol属性)) 方法二: 使用Object.keys()遍历 (返回一个数组,包括对 ...

  8. javascript 数组对象根据相同属性值{key:value}合并两个对象

    前言 js 数组对象的合并,方便自己后续使用与学习,废话少说,这段代码的功能就是根据某个相同的value值合并两个数组对象 比如:根据相同的hotelId来合并 一 , 数组对象根据相同属性值合并两个 ...

  9. php 获取js对象的属性值,js获取对象,数组所有属性键值(key)和对应值(value)的方法示例...

    本文实例讲述了js获取对象,数组所有属性键值(key)和对应值(value)的方法.分享给大家供大家参考,具体如下: var values=function(object) { var values ...

最新文章

  1. 【java】itoo项目实战之hibernate 懒载入优化性能
  2. 对B样条的理解和整理
  3. MATLAB实战系列(四)- LabVIEW初探
  4. 关于蓝牙服务UUID自定义简介
  5. windows 64位 安装mvn提示 不是内部或外部命令
  6. mongo数据库插入数据_深入研究Mongo数据库
  7. ext.net 开发学习——常用布局(八)
  8. html网站页面上字体改变,如何设置网页字体样式
  9. html网页制作代码大全:庆余年——电影网站7页,不包含js 有登陆注册,表格 table布局 ,有的登录注册页面,内嵌 css
  10. 如何对萤石云视频解码
  11. vue elementui table表格序号一列 样式设计
  12. 【渝粤教育】国家开放大学2018年秋季 1046t金融学 参考试题
  13. Composure获取子层级图像:使用变换通道
  14. MFC-----CMap
  15. (2000-2020高精度世界人口密度地图下载分享【附下载链接】
  16. linux 进程 signal,c/c++ linux 进程间通信系列1,使用signal,kill
  17. Java对象在内存中的存储
  18. 好用的Maven仓库推荐
  19. html内外边距怎么设置,css内边距怎么设置?
  20. 千里之堤毁于蚁穴(慎用HD Wallets)

热门文章

  1. 人工智能到底威胁人类还是造福人类?
  2. Py之configobj:configobj的简介、安装、使用方法之详细攻略
  3. TF之DNN:TF利用简单7个神经元的三层全连接神经网络【2-3-2】实现降低损失到0.000以下
  4. ML之回归预测:利用两种机器学习算法(LiR,XGBoost(调优+重要性可视化+特征选择模型))对无人驾驶汽车系统参数(2017年的data,18+2)进行回归预测值VS真实值
  5. DL之DNN:利用MultiLayerNetExtend模型【6*100+ReLU+SGD,dropout】对Mnist数据集训练来抑制过拟合
  6. ML之回归预测:利用13种机器学习算法对Boston(波士顿房价)数据集【13+1,506】进行回归预测(房价预测)+预测新数据得分
  7. Dataset之Rotten Tomatoes:Rotten Tomatoes影评数据集简介、下载、使用方法之详细攻略
  8. ML之Clustering之K-means:K-means算法简介、应用、经典案例之详细攻略
  9. BlockChain:Python一步一步实现(流程最清楚)区块链底层技术流程图(理解一目了然,值得收藏)
  10. MQ各个元素的详细理解