2017-03-03 4 views
0

Ich habe 2 Arten von Objekten, eine group und eine item. Eine Gruppe kann children haben, was entweder eine array of groups oder eine array of items ist.Holen Sie tiefste Ebene Kinder von verschachtelten Objekten in Javascript

Ich habe eine Reihe von verschachtelten Gruppen (die unendlich tief sein können) und ich muss alle Elemente abrufen, egal wie viele Ebenen tief, mit nur einer Gruppe zu arbeiten.

Gibt es eine Möglichkeit, alle Elemente aus der Top-Level-Gruppe in der folgenden Datenstruktur abzurufen?

{ 
    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

Ihre Datenstruktur ist nicht gültig. Arrays haben keine Eigenschaft in einem Literal. –

+0

Wenn Sie es richtig machen, verwenden Sie Rekursion Tech, um dies zu erreichen. – Jai

+0

Da Ihnen in einem tatsächlichen Array keine Eigenschaftsbezeichnungen zur Verfügung stehen, wie unterscheiden Sie zwischen einem Array von Gruppenobjekten und einem Array von Objektobjekten? Wenn Sie ein Beispiel für ein tatsächliches Array anzeigen und die Gruppen- und Objektdefinitionen einschließen können, ist dies möglicherweise einfacher. – Nope

Antwort

1

Sie könnten eine iterative mit Array#reduce und rekursive Verwendung mit iter wieder aufrufen, Ansatz.

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

Großartig, danke! –

1

Sie können es mit Rekursion erreichen.

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

Super, danke! –

Verwandte Themen