0
votes

Trouver la position de la matrice super imbriquée d'objets

J'essaie de trouver la position exacte et d'accéder à toutes les propriétés de la matrice super imbriquée d'objets.

Je suis en difficulté pour créer une fonction où si je donne un numéro d'index comme paramètre d'entrée, cela devrait me donner la position de la matrice et accéder également à toutes les propriétés en retour. P>

Voici le tableau d'échantillons d'objet P>

Je suis ok avec l'ES6 et la solution ci-dessus trop strong> p>

p>

{
	"name": "branch 1",
	"index": 1,
	"children": [{
			"name": "sub child 1",
			"index": 2,
			"children": [{
				"name": "subx2 child 1",
				"index": 3,
				"children": [{
						"name": "subx3 child 1",
						"index": 4,
						"children": [{
								"name": "subx4 child 1",
								"index": 21
							},
							{
								"name": "subx4 child 2",
								"index": 18
							}
						]
					},
					{
						"name": "subx3 child 2",
						"index": 6,
						"children": [{
								"name": "subx4 child 1",
								"index": 7
							},
							{
								"name": "subx4 child 2",
								"index": 21
							}
						]

					},
					{
						"name": "subx3 child 3",
						"index": 22
					}
				]
			}]
		},
		{
			"name": "sub child 2",
			"index": 28
		}
	]
}


4 commentaires

"Cela devrait me donner sa position dans le tableau et accéder à toutes les propriétés en retour" : veuillez fournir un exemple concret d'entrée et de sortie attendue.


Par exemple, mon nom de fonction est FindChildIndex (Indexnnumber), par exemple, si 22 Il devrait me renvoyer, c'est la position renvoie-moi ces enfants [0]. Children [2].


Je pense que vous devez vous demander pourquoi ces données sont structurées comme ceci. Les données plates sont meilleures pour JSON.


@JOelloyd Cette donnée est utilisée pour npmjs.com/package/react-d3-treee alors je ne peux pas m'empêcher! :(


3 Réponses :


2
votes

Vous pouvez utiliser la récursion et vérifier si enfants code> de l'élément existe utiliser pour code> en boucle à itérer à tous les enfants code> et appliquer de manière récursive le Fonction de chaque enfant

p>

const obj = {
	"name": "branch 1",
	"index": 1,
	"children": [{
			"name": "sub child 1",
			"index": 2,
			"children": [{
				"name": "subx2 child 1",
				"index": 3,
				"children": [{
						"name": "subx3 child 1",
						"index": 4,
						"children": [{
								"name": "subx4 child 1",
								"index": 21
							},
							{
								"name": "subx4 child 2",
								"index": 18
							}
						]
					},
					{
						"name": "subx3 child 2",
						"index": 6,
						"children": [{
								"name": "subx4 child 1",
								"index": 7
							},
							{
								"name": "subx4 child 2",
								"index": 21
							}
						]

					},
					{
						"name": "subx3 child 3",
						"index": 22
					}
				]
			}]
		},
		{
			"name": "sub child 2",
			"index": 28
		}
	]
}

function find(obj,index){
  if(obj.children){
    for(let i = 0;i<obj.children.length;i++){
      let x = find(obj.children[i],index);
      if(x) return {...x,pos:i};
    }

  }
  return obj.index === index ? obj : false;
}

console.log(find(obj,21))


1 commentaires

Merci pour l'aide. Juste une question ici comment puis-je connaître la position de l'index où elle est présente comme pour 22 cela pourrait être obj.children [0]. Children [0]. Children [2].



1
votes

Si j'ai eu votre question correctement, vous pouvez faire quelque chose comme ceci:

const func=(obj,index, nested=0)=>{
    return Obj.index===index ? {obj, nested} : func(obj.children,index, nested+1)
}


0 commentaires

3
votes

Vous pouvez récupérer les index dans les matrices code> enfants code> qui conduisent à l'index cible:

p>

function findIndexNested(data, index) {
    if (data.index === index) return [];
    let result;
    const i = (data.children || []).findIndex(child => {
        return result = findIndexNested(child, index)
    });
    if (result) return [i, ...result];
}
function findByPath(data, path) {
    for (let i of path) data = data.children[i];
    return data
}
// Sample data
const data = {"name": "branch 1","index": 1,"children": [{"name": "sub child 1","index": 2,"children": [{"name": "subx2 child 1","index": 3,"children": [{"name": "subx3 child 1","index": 4,"children": [{"name": "subx4 child 1","index": 21},{"name": "subx4 child 2","index": 18}]},{"name": "subx3 child 2","index": 6,"children": [{"name": "subx4 child 1","index": 7},{"name": "subx4 child 2","index": 21}]},{"name": "subx3 child 3","index": 22}]}]},{"name": "sub child 2","index": 28}]}
const index = 22
const result = findIndexNested(data, index);
console.log("Found index " + index + " via these child indexes: " + result);
console.log("The object is", findByPath(data, result));


11 commentaires

Merci, @Trincot pour l'aide! J'apprécie vraiment cela.


Comment puis-je former obj.children [0] .children [0 ].children [2] du retour de la matrice [0,0,2]?


Vous voulez dire, comme une chaîne?


Oui, comme je veux le stocker dans la variable comme var properties = obj.children [0]. Children [0]. Children [2] . Si vous pouvez, aidez-moi s'il vous plaît


Attendez, ce n'est pas une chaîne. Vous voulez dire var properties = "obj.children [0]. Children [0]. Children [2]" "?


désolé je ne veux pas dire chaîne, je veux comme ça var properties = obj.children [0 ].children [0] .children [2] Pouvez-vous aider?


désolé je ne veux pas dire chaîne, je veux comme ça var properties = obj.children [0 ].children [0] .children [2] Pouvez-vous aider?


Mais c'est une référence simple à l'objet enfant. Vous auriez juste Propriétés pointant sur l'objet le plus profond sans suivre comment s'y rendre. Si obj.children [0] .children [0]. Children [2] n'est pas une chaîne, alors vous n'avez pas le chemin, juste la référence de l'objet.


Peut-être que vous voulez avoir une fonction qui retournera cet objet enfant lorsque vous le transmettez un tableau comme [0, 0, 2]?


Oui @Trincot Monsieur, c'est exactement ce que je cherche! :) Est-ce possible?


Ajouté à ma réponse.