2016-07-04 84 views
0

我有一个从JSON对象产生这样的大型菜单:过滤器嵌套JSON在角

[ 
    { 
     "name":"Menu Item 1", 
     "id":"8", 
     "children":[ 
     { 
      "name":"Sub Menu 1-1", 
      "id":"1", 
      "children":[ 
       { 
        "name":"Sub Menu 1.1.1", 
        "id":"2" 
       }, 
       { 
        "name":"Sub Menu 1.1.2", 
        "id":"3" 
       } 
      ] 
     }, 
     { 
      "name":"Sub Menu 1.2", 
      "id":"4" 
     } 
     ] 
    }, 
    { 
     "name":"Menu Item 2", 
     "id":"7", 
     "children":[ 
     { 
      "name":"Sub Menu 2.1", 
      "id":"5" 
     }, 
     { 
      "name":"Sub Menu 2.2", 
      "id":"6" 
     } 
     ] 
    } 
] 

如何创建自定义过滤器只检索他们的名字匹配的项目递归不改变原来的结构?

回答

1

试试这个。

var menuItems =[{ name: 'Menu Item 1', id: '8', children:[{ name: 'Sub Menu 1-1', id: '1', children: [{ name: 'Sub Menu 1.1.1', id: '2' }, { name: 'Sub Menu 1.1.2', id: '3' }] }, { name: 'Sub Menu 1.2', id: '4' }]},{ name: 'Menu Item 2', id: '7', children: [{ name: 'Sub Menu 2.1', id: '5' }, { name: 'Sub Menu 2.2', id: '6' }] }]; 
 

 
var result = []; 
 

 
function isObject(obj) { 
 
    return (!!obj.name && !!obj.id); 
 
} 
 

 
function hasChildren(obj) { 
 
    return !!obj.children && Array.isArray(obj.children); 
 
} 
 

 
function getNameList(item, matchName) { 
 
    if(Array.isArray(item)) { 
 
    for(var i = 0; i < item.length; i++) { 
 
     if(hasChildren(item[i])) { 
 
     getNameList(item[i].children, matchName); 
 
     } 
 
     if(isObject(item[i])) { 
 
     if(matchName == item[i].name) result.push(item[i]); 
 
     } 
 
    } 
 
    } 
 
} 
 

 
getNameList(menuItems, 'Menu Item 1'); 
 

 
console.log(result);