2017-03-03 103 views
0

我有2种类型的对象,groupitem。一个组可以有children,它可以是array of groupsarray of items从javascript中的嵌套对象中获取最深层次的子对象

我已经结束了一系列嵌套组(它可以是无限级深层),并且我需要检索所有项目,无论深度有多少级别,只有一个组可以使用。

有没有办法在以下数据结构中检索顶级组中的所有项目?

{ 
    type: 'group', 
    children: [ 
    { 
     type: 'group', 
     children: [ 
     { 
      type: 'group', 
      children: [{type:'item'}, {type:'item'}, {type:'item'}] 
     }, 
     { 
      type: 'group', 
      children: [{type:'item'}, {type:'item'}, {type:'item'}] 
     }, 
     { 
      type: 'group', 
      children: [{type:'item'}, {type:'item'}, {type:'item'}] 
     }, 
     ] 
    }, 
    { 
     type: 'group', 
     children: [ 
     { 
      type: 'group', 
      children: [{type:'item'}] 
     }, 
     { 
      type: 'group', 
      children: [{type:'item'}] 
     }, 
     { 
      type: 'group', 
      children: [{type:'item'}] 
     }, 
     ] 
    }, 
    { 
     type: 'group', 
     children: [ 
     { 
      type: 'group', 
      children: [{type:'item'}, {type:'item'}] 
     }, 
     { 
      type: 'group', 
      children: [{type:'item'}, {type:'item'}] 
     }, 
     { 
      type: 'group', 
      children: [{type:'item'}, {type:'item'}] 
     }, 
     ] 
    }, 
    ] 
} 
+1

你的数据结构是无效的。数组在文字中没有属性。 –

+0

如果你使它正确,然后使用递归技术来迎合这一点。 – Jai

+0

由于在实际数组中不会有属性标签可用,因此如何区分组对象数组和项目对象数组?如果您可以显示实际数组的示例并包含组和项目对象定义,则可能更容易。 – Nope

回答

1

你可以使用迭代与Array#reduce和递归与再次调用iter,方法。

var data = { children: [{ children: [{ children: [{ name: 'item1' }, { name: 'item2' }, { name: 'item3' }] }, { children: [{ name: 'item1' }, { name: 'item2' }, { name: 'item3' }] }, { children: [{ name: 'item1' }, { name: 'item2' }, { name: 'item3' }] }] }, { children: [{ children: [{ name: 'item1' }] }, { children: [{ name: 'item1' }] }, { children: [{ name: 'item1' }] }] }, { children: [{ children: [{ name: 'item1' }, { name: 'item2' }, { name: 'item3' }] }, { children: [{ name: 'item1' }, { name: 'item2' }, { name: 'item3' }] }, { children: [{ name: 'item1' }, { name: 'item2' }, { name: 'item3' }] }] }] }, 
 
    children = [data].reduce(function iter(r, a) { 
 
     if (Array.isArray(a.children)) { 
 
      return a.children.reduce(iter, r); 
 
     } 
 
     r.push(a); 
 
     return r; 
 
    }, []); 
 

 
console.log(children);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

太好了,谢谢! –

1

你可以通过递归来实现它。

var data = { 
 
    children: [ 
 
    { 
 
     children: [ 
 
     { 
 
      children: [{ name: 'item1' }, { name: 'item2' }, { name: 'item3' }] 
 
     }, 
 
     { 
 
      children: [{ name: 'item1' }, { name: 'item2' }, { name: 'item3' }] 
 
     }, 
 
     { 
 
      children: [{ name: 'item1' }, { name: 'item2' }, { name: 'item3' }] 
 
     } 
 
     ] 
 
    }, 
 
    { 
 
     children: [ 
 
     { 
 
      children: [{ name: 'item1' }] 
 
     }, 
 
     { 
 
      children: [{ name: 'item1' }] 
 
     }, 
 
     { 
 
      children: [{ name: 'item1' }] 
 
     } 
 
     ] 
 
    }, 
 
    { 
 
     children: [ 
 
     { 
 
      children: [{ name: 'item1' }, { name: 'item2' }, { name: 'item3' }] 
 
     }, 
 
     { 
 
      children: [{ name: 'item1' }, { name: 'item2' }, { name: 'item3' }] 
 
     }, 
 
     { 
 
      children: [{ name: 'item1' }, { name: 'item2' }, { name: 'item3' }] 
 
     } 
 
     ] 
 
    } 
 
    ] 
 
}; 
 

 

 
function getAllChildren(group, children) { 
 
    children = children || []; 
 
    if(group && Array.isArray(group.children)) { 
 
    group.children.forEach(function(child) { 
 
     getAllChildren(child, children) 
 
    }); 
 
    } 
 
    else { 
 
    children.push(group); 
 
    } 
 
    return children; 
 
} 
 

 
console.log(getAllChildren(data));

+0

太棒了,谢谢! –