[
{
"AA": "111",
"BB": "222",
"CC": "333",
"DD": "",
"EE": "444",
"CHILDREN": {
"MM": "555",
"TT": "666",
"CHILDREN": {
"MM": "555",
"TT": "000",
"NAME":"TOM"
"CHILDREN": {
"MM": "555",
"TT": "555",
"NAME": "JACK"
}
}
},
"NAME": "INSI",
"VALUE": "000000",
"TYPE": "CN"
},
{
"AA": "111",
"BB": "222",
"CC": "333",
"DD": "",
"EE": "444",
"CHILDREN": {
"MM": "555",
"TT": "YYY",
"CHILDREN": {
"MM": "555",
"TT": "666",
"NAME": "000"
}
},
"NAME": "INSI",
"VALUE": "000000",
"TYPE": "CN"
},
{
"AA": "111",
"BB": "222",
"CC": "333",
"DD": "",
"EE": "444",
"CHILDREN": {
"MM": "555",
"TT": "777",
"NAME": "111",
"CHILDREN": {
"MM": "555",
"TT": "777",
"NAME": "111",
"CHILDREN": {
"MM": "555",
"TT": "777",
"NAME": "JACK"
}
}
},
"NAME": "NNN",
"VALUE": "000000",
"TYPE": "CN"
}
]
在树状数组中查找符合条件目标,如果第一层级NAME值为JACK,返回这个对象,如果不等于JACK,继续查找所有节点CHILDREN,直到找到符合条件的对象,返回所有符合条件的对象,数组有很多CHILDREN.无法确定有多少节点,目前想到遍历递归,求个效率高的算法
你这种只能去遍历了。递归吧
我的思路是递归
function findJack(data){
const res = []
function isJack(c){
if(c.NAME === 'JACK'){
res.push(c)
}
else if(c.CHILDREN){
isJack(c.CHILDREN)
}
}
data.forEach(isJack)
return res
}
不一定非要用dfs,这个题目bfs也可以,如果查找的姓名在上面几层,用bfs快很多,如果在最底层,用dfs快很多。当然也可以使用两种配合使用,指定bfs查找几层后,没有找到就直接dfs搜吧
用递归即可
var arr = [
{
"AA": "111",
"BB": "222",
"CC": "333",
"DD": "",
"EE": "444",
"CHILDREN": {
"MM": "555",
"TT": "666",
"CHILDREN": {
"MM": "555",
"TT": "000",
"NAME":"TOM",
"CHILDREN": {
"MM": "555",
"TT": "555",
"NAME": "JACK"
}
}
},
"NAME": "INSI",
"VALUE": "000000",
"TYPE": "CN"
},
{
"AA": "111",
"BB": "222",
"CC": "333",
"DD": "",
"EE": "444",
"CHILDREN": {
"MM": "555",
"TT": "YYY",
"CHILDREN": {
"MM": "555",
"TT": "666",
"NAME": "000"
}
},
"NAME": "INSI",
"VALUE": "000000",
"TYPE": "CN"
},
{
"AA": "111",
"BB": "222",
"CC": "333",
"DD": "",
"EE": "444",
"CHILDREN": {
"MM": "555",
"TT": "777",
"NAME": "111",
"CHILDREN": {
"MM": "555",
"TT": "777",
"NAME": "111",
"CHILDREN": {
"MM": "555",
"TT": "777",
"NAME": "JACK"
}
}
},
"NAME": "NNN",
"VALUE": "000000",
"TYPE": "CN"
}
];
var res = [];
function pfun(obj) {
if (obj.NAME=="JACK") {
res.push(obj);
return;
}
if (obj.CHILDREN) {
pfun(obj.CHILDREN);
return;
}
}
arr.forEach(function(v, i){
pfun(v);
});
console.log(res);
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
用别人的getchildren,不断递归,肯定慢啊
你把json当成字符串,只是检索关键字,就快很多。只需要三四次全局扫描的时间
转换成字符串用正则表达式吧,会快很多