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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。