<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>json-query</title> <script type="text/javascript"> var json = [{"value":"1","text":"中國","pid":"0","children":[{"value":"2","text":"山東省","pid":"1","children":[{"value":"3","text":"濟南市","pid":"2","children":[{"value":"4","text":"歷城區","pid":"3","children":[]},{"value":"5","text":"歷下區","pid":"3","children":[]},{"value":"6","text":"高新區","pid":"3","children":[{"value":"fe8de48f20e54590bf60a83c4485a650","text":"南白花","pid":"6","children":[]},{"value":"4ac6d79609b5496f9296614ef4166ac7","text":"北白花","pid":"6","children":[]}]}]}]}]}] </script> <script type="text/javascript"> /** * 遞歸查詢JSON樹 父子節點 */ var parentNode = null; var node = null; /** * 根據text查找當前節點以及父節點 */ function getNode(json, text) { //1.第一層 root 深度遍歷整個JSON for (var i = 0; i < json.length; i++) { if (node) { break; } var obj = json[i]; //沒有就下一個 if (!obj || !obj.text) { continue; } //2.有節點就開始找,一直遞歸下去 if (obj.text == text) { //找到了與text匹配的節點,結束遞歸 node = obj; break; } else { //3.如果有子節點就開始找 if (obj.children&&obj.children.length!=0) { //4.遞歸前,記錄當前節點,作為parent 父親 parentNode = obj; //遞歸往下找 getNode(obj.children, text); } else { //跳出當前遞歸,返回上層遞歸 continue; } } } //5.如果木有找到父節點,置為null,因為沒有父親 if (!node) { parentNode = null; } //6.返回結果obj return { parentNode: parentNode, node: node }; } //批量查詢 var query = '南白花'; var result = []; var getResult = function(json,query){ node = null; parentNode = null; var obj = getNode(json, query); //判斷是否閉包 if(obj.parentNode){ //有父節點 console.log("查詢text:" + query + ", 結果:" + obj.node.text + " -> 父級:" + (obj.parentNode ? obj.parentNode.text : '木有父級!')); //獲取父節點text繼續查祖節點 getResult(json,obj.parentNode.text); result.push(obj.parentNode.text); } return result; } getResult(json,query); //最后將查詢push到result中 result.push(query); console.log(result);//['中國','山東省','濟南市','高新區','南白花'] </script> </head> <body> </body> </html>