1

J'ai une Datastructure comme celle-ci.empêche la référence circulaire dans Array en Javascript

array=[ 
    {id:"a",children:[ 
     {id:"b",children:[ 
      {id:"d",children:[]}]}, 
      {id:"c",children:[]}]} 
] 

Si je veux insérer l'élément {id:"e", children:["a","f"] à « c » (« a », « e » n'y a pas de chaînes, mais des copies des nœuds) Je veux vérifier qu'il existe dans l'arbre supérieur et créerait donc une référence circulaire. Donc, je pense que je dois inverser marcher le tableau. Mais comme je suis assez nouveau sur Javascript et Node, je n'ai aucune idée de comment faire ça.

Serait-il une bonne idée, pour créer un tableau, je stocke toutes les dépendances? quelque chose comme ceci:

[ 
a:[], 
b:[a], 
c:[a,b] 
d:[a,b] 
] 

alors je pourrais rechercher le parent dans le tableau et verrait que c, a et b sont allready dans la dépendance

+0

Ceci est un peu déroutant, mais l'insertion d'un nouvel objet comme ça ne va pas créer une référence circulaire, il insère simplement un nouvel objet? Pour faire une référence circulaire, l'objet doit se référer à lui-même. – adeneo

+0

peut-être que je l'ai mal écrit. Je ne voudrais pas ajouter un élément avec des chaînes comme "a", "e" mais avec des copies des nœuds. Donc, il en créerait un – Florian

+0

Si 'children: [e]' se référait réellement à l'objet parent, vous auriez une référence circulaire, mais cela semble improbable et la plupart du temps ne poserait pas de problème. De toute façon, ce que vous voulez vérifier n'est pas clair? Lorsque vous insérez cet objet, voulez-vous vérifier qu'il n'y a pas plus d'objets avec l'id '" e "' ou que l'objet n'a pas déjà de références circulaires, ou quoi? – adeneo

Répondre

1

Vous pouvez utiliser une table de hachage, si l'identifiant est unique .

var array = [{ id: "a", children: [{ id:"b", children: [{ id: "d", children: [] }] }, { id: "c", children: [] }] }], 
 
    hash = Object.create(null); 
 

 
// creating circular reference 
 
array[0].children[1].children.push(array[0]); 
 

 
array.forEach(function iter(a) { 
 
    if (hash[a.id]) { 
 
     console.log(a.id, 'circular reference found'); 
 
     return; 
 
    } 
 
    hash[a.id] = true; 
 
    a.children.forEach(iter); 
 
}); 
 
console.log(array);