Quelqu'un peut-il aider à convertir la liste suivante d'objets parent-enfant:
J'ai ci-dessous le tableau d'objets, besoin de le convertir en ordre parent-enfant. chaque attribut «Membres» dans un objet peut contenir 1 ou n objets. Dans le tableau 'Members', le 1er objet est le parent du 2ème et le 2ème est le parent du troisième objet.
Donc dans le 1er membre "Video" est le parent de "West" et "West" est le parent de "India" et ainsi de suite.
J'ai essayé de parcourir les éléments un par un mais je n'ai pas pu atteindre le résultat souhaité.
Toute aide avec la logique ou le code serait vraiment utile.
Entrée:
[
{
"name": "Videos",
"children": [
{
"name": "West",
"children": [
{
"name": "India",
"children": []
},
{
"name": "Japan",
"children": []
}
]
},
{
"name": "South",
"children": [
{
"name": "Australia",
"children": []
}
]
}
]
},
{
"name": "Machinery",
"children": [
{
"name": "South",
"children": [
{
"name": "Australia",
"children": []
}
]
},
{
"name": "West",
"children": [
{
"name": "India",
"children": []
}
]
}
]
},
{
"name": "Electronics",
"children": [
{
"name": "Midwest",
"children": [
{
"name": "Arab",
"children": []
}
]
},
{
"name": "NorthEast",
"children": [
{
"name": "Japan",
"children": []
}
]
}
]
}
]
```
Résultat attendu:
[
{
"Members": [
{
"Name": "Videos"
},
{
"Name": "West"
},
{
"Name": "India"
}
]
},
{
"Members": [
{
"Name": "Machinery"
},
{
"Name": "South"
},
{
"Name": "Australia"
}
]
},
{
"Members": [
{
"Name": "Electronics"
},
{
"Name": "Midwest"
},
{
"Name": "Arab"
}
]
},
{
"Members": [
{
"Name": "Machinery"
},
{
"Name": "West"
},
{
"Name": "India"
}
]
},
{
"Members": [
{
"Name": "Electronics"
},
{
"Name": "NorthEast"
},
{
"Name": "Japan"
}
]
},
{
"Members": [
{
"Name": "Videos"
},
{
"Name": "South"
},
{
"Name": "Australia"
}
]
},
{
"Members": [
{
"Name": "Videos"
},
{
"Name": "West"
},
{
"Name": "Japan"
}
]
}
]
3 Réponses :
Ce n'est peut-être pas la meilleure façon de procéder et cela ne fonctionne que pour 3 niveaux.
var data = [
{
"Members": [
{
"Name": "Videos"
},
{
"Name": "West"
},
{
"Name": "India"
}
]
},
{
"Members": [
{
"Name": "Machinery"
},
{
"Name": "South"
},
{
"Name": "Australia"
}
]
},
{
"Members": [
{
"Name": "Electronics"
},
{
"Name": "Midwest"
},
{
"Name": "Arab"
}
]
},
{
"Members": [
{
"Name": "Machinery"
},
{
"Name": "West"
},
{
"Name": "India"
}
]
},
{
"Members": [
{
"Name": "Electronics"
},
{
"Name": "NorthEast"
},
{
"Name": "Japan"
}
]
},
{
"Members": [
{
"Name": "Videos"
},
{
"Name": "South"
},
{
"Name": "Australia"
}
]
},
{
"Members": [
{
"Name": "Videos"
},
{
"Name": "West"
},
{
"Name": "Japan"
}
]
}
];
function organize(dataBefore){
var dataAfter = [];
dataAfter.push({
name: dataBefore[0].Members[0].Name,
children: []
});
for(var i = 1; i < dataBefore.length; i++){
if(!doesExist(dataAfter, dataBefore[i].Members[0].Name)){
dataAfter.push({
name: dataBefore[i].Members[0].Name,
children: []
});
}
}
dataAfter[0].children.push({
name: dataBefore[0].Members[1].Name,
children: []
});
for(var i = 1; i < dataBefore.length; i++){
for(var j = 0; j < dataAfter.length; j++){
if(dataAfter[j].name == dataBefore[i].Members[0].Name){
if(!doesExist(dataAfter[j].children, dataBefore[i].Members[1].Name)){
dataAfter[j].children.push({
name: dataBefore[i].Members[1].Name,
children: []
});
}
}
}
}
dataAfter[0].children[0].children.push({
name: dataBefore[0].Members[2].Name,
children: []
});
for(var i = 1; i < dataBefore.length; i++){
for(var j = 0; j < dataAfter.length; j++){
if(dataAfter[j].name == dataBefore[i].Members[0].Name){
for(var k = 0; k < dataAfter[j].children.length; k++){
if(dataAfter[j].children[k].name == dataBefore[i].Members[1].Name){
if(!doesExist(dataAfter[j].children[k].children, dataBefore[i].Members[2].Name)){
dataAfter[j].children[k].children.push({
name: dataBefore[i].Members[2].Name,
children: []
});
}
}
}
}
}
}
return dataAfter;
}
function doesExist(checkThisData, searchValue){
for(var i = 0; i < checkThisData.length; i++){
if(searchValue == checkThisData[i].name){
return true;
}
}
return false;
}
console.log(organize(data));
C'est très compliqué: p
@Adnam - Merci pour le code, cela fonctionne très bien pour le niveau 3. Par hasard, pouvez-vous aider de quelque manière que ce soit pour ne pas le limiter au seul niveau 3. Merci pour vos efforts
oui je crois que je peux. J'essaierai de te recontacter
Je ne peux pas trouver une solution lol. La structure des données est épouvantable: p +1, bien fait. Je vais continuer d'essayer cependant;)
@Andam en a finalement fait un :)
@Kobe fantastique. Oui, j'ai regardé les résultats. Je pense que c'est encore différent ou que mes yeux me dérangent.
@Andam je me suis assuré que c'était juste cette fois :) Toujours agréable d'avoir un défi
@Kobe Oui, je suis d'accord. Le défi est la partie amusante ici. À propos du résultat, je pense que vous avez un nœud supplémentaire au début. vous avez deux vidéos> nœuds ouest dans la réponse. pour autant que je sache.
@Kobe vous êtes venu assez loin Je suis sûr que vous pouvez comprendre et résoudre le problème. Bonne chance
Mec, ça a pris trop de temps. Mais cela fonctionne avec des ensembles de données plus volumineux. Remarque à OP, n'utilisez jamais cette structure de données. Déjà. C'est horrible. J'ai perdu beaucoup de cerveaux en faisant cette solution:
var arr = [
{Members: [{ Name: "Videos" }, { Name: "West" }, { Name: "India" }, {Name: 'Testing'}]},
{Members: [{ Name: "Machinery" }, { Name: "South" }, { Name: "Australia" }]},
{Members: [{ Name: "Electronics" }, { Name: "Midwest" }, { Name: "Arab" }]},
{Members: [{ Name: "Machinery" }, { Name: "West" }, { Name: "India" }]},
{Members: [{ Name: "Electronics" }, { Name: "NorthEast" }, { Name: "Japan" }]},
{Members: [{ Name: "Videos" }, { Name: "South" }, { Name: "Australia" }]},
{Members: [{ Name: "Videos" }, { Name: "West" }, { Name: "Japan" }]}
];
const addRelation = (obj, m, i) => ({...obj, parent: i === 0 ? null : m.slice(0, i).map(el => el.Name).join('.'), level: i, children: []})
const arrayToTree = (arr) => {
arr = arr.map(({ Members: m }) => m.map((obj, i) => addRelation(obj, m, i))).reduce((acc, arr) => {
arr.map(obj => acc.push(obj))
return acc
}, []).sort((a, b) => b.level - a.level)
var temp = [...arr].filter((o, index, self) =>
index === self.findIndex((t) => (
t.Name === o.Name && t.parent === o.parent
))
)
arr.forEach(() => {
if (temp[0].level === 0) return
var parentIndex = temp.findIndex(o => {
var str = temp[0].parent
var rest = str.substring(0, str.lastIndexOf("."));
var last = str.substring(str.lastIndexOf(".") + 1, str.length);
var parents = [rest, last]
return parents[0] !== ''
? o.Name === parents[1] && o.parent === parents[0]
: o.Name === temp[0].parent
})
const { Name, children } = temp[0]
temp[parentIndex].children.push({Name, children})
temp.shift()
})
return temp.map(({ Name, children }) => ({ Name, children }))
}
arr = arrayToTree(arr)
console.log(arr)
Bonjour, nous nous revoyons. :RÉ. votre réponse est bien meilleure que la mienne, alors ne le prenez pas dans le mauvais sens, mais cela ne reproduit pas le résultat souhaité.
@Andam j'ai corrigé ça tout à l'heure :)
Cela fonctionne mais ce n'est pas la même structure que son résultat attendu
@Andam Pouvez-vous s'il vous plaît indiquer où je me suis trompé afin que je puisse le réparer
Vous ne vous êtes pas trompé mais son résultat est comme ceci Vidéos> Ouest> Inde, Japon mais votre réponse est Vidéos> Ouest> Inde, Vidéos> Ouest> Japon
Ah oui, je viens de remarquer ça, je vais réparer ça maintenant, merci.
Je n'ai pas réussi à le faire moi-même dans .map, donc je suis intéressé à voir votre résultat
Ce que @Adnam a dit est correct. La sortie n'est pas alignée sur la sortie attendue. N'importe quelle sorte d'aide serait appréciée. Tous les moyens merci d'avance.
@Kobe - Il ajoute un enfant supplémentaire / dupliqué "West" à "video". Je peux vraiment comprendre la quantité d'efforts qu'il a consommés. Merci.
@Kracki corrigé :)
Merci :) Je n'aurais pas dû prendre si longtemps, mais le manque de relations m'a vraiment jeté à mi-chemin
@Kracki Je suis d'accord avec Kobe, il aurait été beaucoup plus facile si vous aviez une structure correcte pour vos données.
@Andam - Oui, je suis d'accord avec vous. Mais je n'ai pas d'autre option que de gérer ces données. Merci pour l'aide :-)
Je conseillerais d'utiliser la combinaison carte + réduction:
const data = [{
"Members": [{
"Name": "Videos"
},
{
"Name": "West"
},
{
"Name": "India"
}
]
},
{
"Members": [{
"Name": "Machinery"
},
{
"Name": "South"
},
{
"Name": "Australia"
}
]
},
{
"Members": [{
"Name": "Electronics"
},
{
"Name": "Midwest"
},
{
"Name": "Arab"
}
]
},
{
"Members": [{
"Name": "Machinery"
},
{
"Name": "West"
},
{
"Name": "India"
}
]
},
{
"Members": [{
"Name": "Electronics"
},
{
"Name": "NorthEast"
},
{
"Name": "Japan"
}
]
},
{
"Members": [{
"Name": "Videos"
},
{
"Name": "South"
},
{
"Name": "Australia"
}
]
},
{
"Members": [{
"Name": "Videos"
},
{
"Name": "West"
},
{
"Name": "Japan"
}
]
}
];
const ar = data.map((el, i) => {
let a = el['Members'].reduce((acc, member, index) => {
if (index === 0) {
acc[index] = {
name: member.Name,
children: []
};
} else {
debugger;
if (acc[0].children.length === 0) {
acc[0].children.push({
name: member.Name,
children: []
});
} else {
acc[0].children[0].children.push({
name: member.Name,
children: []
});
}
}
return acc;
}, []);
return a;
});
console.log(ar);
votre réponse comme la réponse de kobe ne reproduit pas le même résultat que son résultat. son résultat est comme ceci Vidéos> Ouest> Inde, Japon mais votre réponse est Vidéos> Ouest> Inde, Vidéos> Ouest> Japon
Vous avez déjà posé cette question ?? , Je suppose que de telles questions nécessitent des efforts de votre part, cela nous aide à vous donner une meilleure réponse
@Shubh Oui, ici