Javascript 按id搜索动态JSON

Javascript 按id搜索动态JSON,javascript,Javascript,我有一个JSON,其结构如下: { "root": { "containers": [ { "id": UNIQUE_ID, ... "child": [ { "id": UNIQUE_ID, ... "child": [...] } ] }, {

我有一个JSON,其结构如下:

{
 "root": {
    "containers": [
       {
         "id": UNIQUE_ID,
         ...
         "child": [
           {
             "id": UNIQUE_ID,
             ...
             "child": [...]
           }
         ]
       },

       {
         "id": UNIQUE_ID,
         ...
         "child": [...]
       }
    ]
  }
}
root.containers和root.containers.child具有相同的结构。问题是我可以有无限嵌套,而且我事先不知道子节点的总数,因为它们是动态添加到这个JSON中的

我需要一个函数,它只返回给定ID作为参数的特定对象。因此,它必须深入到JSON中,直到找到具有该ID的子项。我尝试了使用.filters进行搜索,但我不知道如何进行更深入的搜索。可能是一些我以前从未用javascript实现过的搜索算法


有人能告诉我如何才能做到这一点吗?谢谢

您可以使用如下()的递归函数:

//这只是一个检查null或未定义的函数
var notEmpty=函数(某物){
if(typeof(something)!='undefined'&&something!==null){
返回true;
}
返回false;
}
//这是一个递归函数,它在dept中进行不确定的搜索(假设上containers节点的所有节点都只有子属性)
var findNodeById=函数(节点,id){
if(notEmpty(node)&¬Empty(node.id)&&node.id==id)
返回节点;
否则{
if(notEmpty(node)和¬Empty(node.child)){
for(var i=0;i
您需要的功能是:

function findById(data, id){
    var found;
    data.forEach(function(o){
        if(found){
            return;
        }
        found = o.id === id && o || o.child && findById(o.child, id);
    });

    return found;
}
它将以这种方式使用:

findById(data.root.containers, 1)
检查并运行以下代码段。它有一些测试,包括一个失败案例

var数据={
“根”:{
“容器”:[
{
“id”:1,
“儿童”:[
{
“id”:2,
“儿童”:[{
身份证号码:3
}, {
身份证号码:4
}]
}
]
},
{
“id”:5,
“儿童”:[{
身份证号码:6
}]
},
{
“id”:7,
“儿童”:[]
}
]
}
};
函数findById(数据,id){
var发现;
data.forEach(函数(o){
如果(找到){
返回;
}
found=o.id==id&&o | | o.child&&findById(o.child,id);
});
发现退货;
}
[1,2,3,4,5,6,7,8].forEach(函数(v){
console.log('==搜索:',v);
log(findById(data.root.containers,v));

});1)编写代码2)执行代码3)调试代码。我们(也许)会帮上忙。另外两个完全由您负责。如果使用递归,任意嵌套的对象很容易遍历。只要在孩子之间循环,如果孩子有任何孩子,就进行递归调用。@MarcB是的,我只要求有想法。。对不起,如果我写的东西让你觉得我是在要求为我做我的工作。我只是不知道该怎么做。我花了好几天的时间在这上面,所以我来到这里,试图找到一个人来启发我,也许能给我一些可以遵循的道路。。我也试图在这里搜索类似的问题,但没有成功。仅此而已。@GabrielPereira“想法”问题在这种环境下很难回答。所以这不是一个讨论设计的论坛。你需要问一些有客观答案的具体问题。这通常意味着自己编写代码,如果无法使用,则发布代码。
findById(data.root.containers, 1)