查找数组中符合条件目标的算法

查找数组算法
数组结构如下,树状数组
[
    {
        "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搜吧

用递归即可

img

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);

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

用别人的getchildren,不断递归,肯定慢啊
你把json当成字符串,只是检索关键字,就快很多。只需要三四次全局扫描的时间

转换成字符串用正则表达式吧,会快很多