javascript
查看java返回的值,JavaScript 遍历对象查找指定的值并返回路径
問:JavaScript 如何查找對象中某個(gè) value 并返回路徑上所有的 key?
let obj = {
key1: 'str1',
key2: {
key3: 'str3'
},
key4: {
key5: {
key6: 'str6',
key7: 'str7'
},
key8: 'str8'
},
key9: 'str9'
};
有例如上面這樣一個(gè)對象,要求封裝一個(gè)函數(shù),傳入對象和某個(gè) value,返回該 value 路徑上的 key。比如:searchKeys(obj, "str3"),得到 "key3, key2"?!?來源于 @zanetti 的一篇 「博問」
我本想在該「博問」下作答,但是「博客園」提示我注冊尚且不滿 24 小時(shí),不允許我回答「博問」欄目的問題。好吧,我確實(shí)是 3 月 16 日晚上剛剛注冊的「博客園」賬號,既然無法回答那就干脆寫第一篇博客。博客的申請?jiān)?3 月 17 日早上剛剛審核通過。
言歸正傳,這題要求遍歷對象,而本質(zhì)其實(shí)就是對一個(gè)多叉樹進(jìn)行遞歸。
封裝函數(shù)并遍歷對象
第一步是最簡單的,不必多說。
function search(object, value) {
for (var key in object) {
// ...
}
}
必須先有結(jié)果
既然知道這里需要遞歸,那么最重要一點(diǎn)就是必須找到結(jié)果,因?yàn)闆]有最終結(jié)果的遞歸操作肯定會(huì)「無法自拔」。此題,當(dāng) key 對應(yīng)的值等于 value 時(shí),遞歸就將結(jié)束,代碼如下。
if (object[key] == value) {
return [key];
} else {
}
然后思考遞歸
現(xiàn)在需要分析一下,如果沒有找到 value,object[key] 的值有哪些情況?
1、一個(gè)不等于 value 字符串;2、一個(gè)對象。
如果是一個(gè)字符串,那么肯定是不需要任何操作,繼續(xù)下一次 for ... in 循環(huán)即可。如果是一個(gè)對象,那么繼續(xù)對這個(gè)對象重復(fù)剛剛的遍歷操作,此處即遞歸。
if (typeof(object[key]) == "object") {
var temp = search(object[key], value);
}
繼續(xù)分析(理論上腦子里面可以假設(shè)這是倒數(shù)第二步即可)。
假如遞歸的操作并沒有找到 value,那么返回值是什么?我用一個(gè) temp 變量來接收返回值,而沒有找到 value 肯定就沒有返回值,所以 temp 應(yīng)該是 undefined。
假如遞歸的操作找到了 value,那么返回值是什么?對,是 key(這里我為了輸出方便,使用了數(shù)組存放所有的 key)。既然得到了最后一步的 key,把他與當(dāng)前的 key 放在一起即可。
if (temp == undefined) {
} else {
return [key, temp].flat();
}
這里我是用了 flat() 方法,這個(gè)方法可以抹平一個(gè)數(shù)組。不管嵌套了多少的數(shù)組,都會(huì)展開成為一個(gè)無嵌套數(shù)組。
舉個(gè)例子:array = ["a", "b", ["c", "d"], ["e", ["f"]]] => array = array.flat() => array = ["a", "b", "c", "d", "e", "f"];
最終函數(shù)
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 的時(shí)間不長,也是個(gè)新手,好在這題主要是遞歸算法,如有錯(cuò)誤請?jiān)谠u論中指出,不勝感激!
總結(jié)
以上是生活随笔為你收集整理的查看java返回的值,JavaScript 遍历对象查找指定的值并返回路径的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 函数分类,PHP Array 函
- 下一篇: JAVA中for循环写杨辉三角,java