2017-09-05 2 views
1

J'ai un tableau et chaque élément est un objet avec des ID uniques. Certains éléments peuvent également avoir des enfants, et il peut y avoir un tableau enfants dans un tableau enfants. J'essaye de choisir un article en utilisant un Id.Recherche d'un objet dans un tableau d'objets profondément imbriqués récursivement

  const array = [ 
       { 
        uuid: '40E75F3DE56B4B11B3AFBDE46785737B' 
       }, { 
        uuid: '9CEF74766BBB4B9682B7817B43CEAE48' 
       }, { 
        uuid: '34F209A883D3406FBA6BACD9E07DB1D9', 
        children: [{ 
         uuid: 'F429C51BF01C405DA517616E0E16DE4E', 
         children: [{ 
          uuid: '8823CFCE7D4645C68991332091C1A05C' 
         }, { 
          uuid: '58A9345E881F48C980498C7FFB68667D' 
         }] 
        }] 
       }, { 
        uuid: '152488CC33434A8C9CACBC2E06A7E535' 
       }, { 
        uuid: '9152B3DEF40F414BBBC68CACE2F5F6E4' 
       }, { 
        uuid: 'B9A39766B17E4406864D785DB6893C3D' 
       }, 
       { 
        uuid: '3J4H4J5HN6K4344D785DBJ345HSSODF', 
        children: [ 
         { 
          uuid: 'EAB14DD72DA24BB88B4837C9D5276859' 
         }, 
         { 
          uuid: 'FFA80D043380481F8835859A0839512B' 
         }, 
         { 
          uuid: '9679687190354FA79EB9D1CA7B4962B1' 
         } 
        ] 
       } 
      ] 

Le code ci-dessous fonctionne pour un tableau simple sans enfants. J'ai besoin d'une fonction, ou un module lodash qui peut récursive rechercher le tableau entier et renvoyer l'objet (élément du tableau)

findContainingObject(array, uuid) { 
    let result = []; 
    result = array.filter(item => { 
     return item.uuid === uuid 
    }) 
    return result; 
} 

Résultats attendus:

findContainingObject(array, '40E75F3DE56B4B11B3AFBDE46785737B') 

       { 
       uuid: '40E75F3DE56B4B11B3AFBDE46785737B' 
       } 

findContainingObject(array, '34F209A883D3406FBA6BACD9E07DB1D9') 
       { 
        uuid: '34F209A883D3406FBA6BACD9E07DB1D9', 
        children: [{ 
         uuid: 'F429C51BF01C405DA517616E0E16DE4E', 
         children: [{ 
          uuid: '8823CFCE7D4645C68991332091C1A05C' 
         }, { 
          uuid: '58A9345E881F48C980498C7FFB68667D' 
         }] 
        }] 
       } 

findContainingObject(array, '58A9345E881F48C980498C7FFB68667D') 

       { 
        uuid: '58A9345E881F48C980498C7FFB68667D' 
       } 

Répondre

4

Cette fonction implémente DFS:

function findDFS(objects, id) { 
    for (let o of objects || []) { 
    if (o.uuid == id) return o 
    const o_ = findDFS(o.children, id) 
    if (o_) return o_ 
    } 
} 

Et BFS:

function findBFS(objects, id) { 
    const queue = [...objects] 
    while (queue.length) { 
    const o = queue.shift() 
    if (o.uuid == id) return o 
    queue.push(...(o.children || [])) 
    } 
} 
+0

Nous vous remercions de la solution. J'allais dans le même sens, mais ne serait pas cher si je devais regarder 'B9A39766B17E4406864D785DB6893C3D'? –

+0

@VamshiGudipati Oui, ce serait cher. D'où vient le tableau d'origine? API côté serveur? Base de données? Avez-vous accès à cela? –

+0

C'est la sortie d'une interface glisser-déposer que nous avons créée et je n'ai aucun contrôle sur les données qui arrivent. J'écris un compilateur pour convertir ces données en une autre forme de données –

1

Voici une réponse similaire, plus de lignes de code pour une meilleure lisibilité peut-être.

const array = [ 
 
    { 
 
     uuid: '40E75F3DE56B4B11B3AFBDE46785737B' 
 
    }, { 
 
     uuid: '9CEF74766BBB4B9682B7817B43CEAE48' 
 
    }, { 
 
     uuid: '34F209A883D3406FBA6BACD9E07DB1D9', 
 
     children: [{ 
 
      uuid: 'F429C51BF01C405DA517616E0E16DE4E', 
 
      children: [{ 
 
       uuid: '8823CFCE7D4645C68991332091C1A05C' 
 
      }, { 
 
       uuid: '58A9345E881F48C980498C7FFB68667D' 
 
      }] 
 
     }] 
 
    }, { 
 
     uuid: '152488CC33434A8C9CACBC2E06A7E535' 
 
    }, { 
 
     uuid: '9152B3DEF40F414BBBC68CACE2F5F6E4' 
 
    }, { 
 
     uuid: 'B9A39766B17E4406864D785DB6893C3D' 
 
    }, 
 
    { 
 
     uuid: '3J4H4J5HN6K4344D785DBJ345HSSODF', 
 
     children: [ 
 
      { 
 
       uuid: 'EAB14DD72DA24BB88B4837C9D5276859' 
 
      }, 
 
      { 
 
       uuid: 'FFA80D043380481F8835859A0839512B' 
 
      }, 
 
      { 
 
       uuid: '9679687190354FA79EB9D1CA7B4962B1' 
 
      } 
 
     ] 
 
    } 
 
    ]; 
 
    
 
    
 
function findContainingObject(array, itemId) { 
 
    let 
 
    index = 0, 
 
    result = null; 
 
    
 
    while (index < array.length && !result) { 
 
    const 
 
     item = array[index]; 
 
     
 
    if (item.uuid === itemId) { 
 
     result = item; 
 
    } else if (item.children !== undefined) { 
 
     result = findContainingObject(item.children, itemId); 
 
    } 
 
    
 
    if (result === null) { 
 
     index++; 
 
    } 
 
    } 
 
    
 
    return result; 
 
} 
 

 
console.log(findContainingObject(array, '40E75F3DE56B4B11B3AFBDE46785737B')); 
 
console.log(findContainingObject(array, '34F209A883D3406FBA6BACD9E07DB1D9')); 
 
console.log(findContainingObject(array, '58A9345E881F48C980498C7FFB68667D'));

+0

Merci @Thijs –

1

Exemple d'utilisation de récursivité.

const data = [{ 
 
    uuid: '40E75F3DE56B4B11B3AFBDE46785737B' 
 
    }, { 
 
    uuid: '9CEF74766BBB4B9682B7817B43CEAE48' 
 
    }, { 
 
    uuid: '34F209A883D3406FBA6BACD9E07DB1D9', 
 
    children: [{ 
 
     uuid: 'F429C51BF01C405DA517616E0E16DE4E', 
 
     children: [{ 
 
     uuid: '8823CFCE7D4645C68991332091C1A05C' 
 
     }, { 
 
     uuid: '58A9345E881F48C980498C7FFB68667D' 
 
     }] 
 
    }] 
 
    }, { 
 
    uuid: '152488CC33434A8C9CACBC2E06A7E535' 
 
    }, { 
 
    uuid: '9152B3DEF40F414BBBC68CACE2F5F6E4' 
 
    }, { 
 
    uuid: 'B9A39766B17E4406864D785DB6893C3D' 
 
    }, 
 
    { 
 
    uuid: '3J4H4J5HN6K4344D785DBJ345HSSODF', 
 
    children: [{ 
 
     uuid: 'EAB14DD72DA24BB88B4837C9D5276859' 
 
     }, 
 
     { 
 
     uuid: 'FFA80D043380481F8835859A0839512B' 
 
     }, 
 
     { 
 
     uuid: '9679687190354FA79EB9D1CA7B4962B1' 
 
     } 
 
    ] 
 
    } 
 
]; 
 

 
let find = (data, uuid) => { 
 
    for (let o of data) { 
 
    if (o.uuid === uuid) { 
 
     return o; 
 
    }; 
 
    if ('children' in o) { 
 
     let ro = find(o.children, uuid); 
 
     if (ro) { 
 
     return ro; 
 
     } 
 
    } 
 
    } 
 
} 
 

 
let result = find(data, '9679687190354FA79EB9D1CA7B4962B1') 
 
console.clear(); 
 
console.log(result);

+0

Par ailleurs, la réponse de @skovorodkin est la plus complète à mon avis +1 :) – GibboK