Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 解析JSON的递归数组_Javascript_Json_Angular - Fatal编程技术网

Javascript 解析JSON的递归数组

Javascript 解析JSON的递归数组,javascript,json,angular,Javascript,Json,Angular,所以我有一个角度组件,它有一个嵌套JSON数组。。。我想使用服务将这些嵌套的JSON加载到数组中它们自己的对象中,这样我就可以通过ID进行查找 也许有更好的方法可以根据id通过大型json进行查找,但我真的不确定如何做到这一点 谢谢你查看我的Q //角度分量 公共节点列表=[ {name:'production 1',id:'1',子项:[ {name:'test one',id:'2',子项:[ {name:'development one',id:'3',children:[]} ]},

所以我有一个角度组件,它有一个嵌套JSON数组。。。我想使用服务将这些嵌套的JSON加载到数组中它们自己的对象中,这样我就可以通过ID进行查找

也许有更好的方法可以根据id通过大型json进行查找,但我真的不确定如何做到这一点

谢谢你查看我的Q

//角度分量
公共节点列表=[
{name:'production 1',id:'1',子项:[
{name:'test one',id:'2',子项:[
{name:'development one',id:'3',children:[]}
]},
{name:'test two',id:'4',子项:[
{name:'development two',id:'5',children:[]}
]}
]}
];
公共节点列表2=[
{name:'production 2',id:'6',子项:[
{name:'test one',id:'7',子项:[
{name:'development third',id:'8',children:[]}
]},
{name:'test two',id:'9',子项:[
{name:'development four',id:'10',children:[]}
]}
]}
];
构造函数(专用sidenav:SideNavService){
this.sidenav.loadNodes(this.nodeList);
this.sidenav.loadNodes(this.nodeList2);
}
//角度服务
allNodes:Array//这可能不是任何类型的?
//在这里,我想传入类似上面组件中所示的列表,并通过它进行解析,将每个JSON放入列表allNodes中
加载节点(树){
}
//在这里,我想传入一个ID并返回该json,无论它嵌套了多远,此时只需获取名称(名称可能不是唯一的)
查找节点(id:字符串){

}
您可以使用一个递归方法沿着这些线展平您的数组(将语法更改为在此处内联运行):

const节点列表=[
{name:'production 1',id:'1',子项:[
{name:'test one',id:'2',子项:[
{name:'development one',id:'3',children:[]}
]},
{name:'test two',id:'4',子项:[
{name:'development two',id:'5',children:[]}
]}
]}
];
常数nodeList2=[
{name:'production 2',id:'6',子项:[
{name:'test one',id:'7',子项:[
{name:'development third',id:'8',children:[]}
]},
{name:'test two',id:'9',子项:[
{name:'development four',id:'10',children:[]}
]}
]}
];
函数展平arr(arr){
返回arr.reduce((输出,对象)=>{
let children=obj.children
输出推送({
名称:obj.name,
id:obj.id
})
if(children&&children.length){
output=output.concat(flattarr(子级))
}
返回输出
}, [])
}

log(展平arr(nodeList))
您可以通过简单的递归遍历数组,而不是展平它

  lookupNode(arr: Array<Object>, id: string) {
    if (arr.id === id) {
      return arr;
    } else if (arr.children) {
      for(let i = 0; i < arr.children.length; i++) {
        let temp = this.lookupNode(arr.children[i], id);
        if (temp !== null) {
          return temp;
        }
      }
    } else {
      return null;
    }
  }
lookupNode(arr:Array,id:string){
如果(arr.id==id){
返回arr;
}否则,如果(arr.children){
for(设i=0;i