2017-03-03 221 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

太棒了,謝謝! –