Je veux analyser JSON comme ci-dessous
jQuery.each(response.topology, function(i,obj) {
if(i == "nodeId") {
node_list.push(obj)
}
if(i == "subs"){
jQuery.each(i, function(key,value) {
if(i == "nodeId") {
node_list.push(obj)
}
}
}
});
Chaque nœud peut avoir des sous-marins et ces sous-marins peuvent avoir des nœuds pouvant avoir leurs propres sous-marins. tout ce que je veux est un tableau ayant tous nodeId, comment puis-je analyser ce JSON de sorte qu'un tableau appelé nodes_list soit rempli avec all nodeId. Je peux utiliser javascript ou jquery.
J'essaye l'approche suivante pour obtenir un tableau de nodeId
{
"nodeId":3892718504,
"root":true,
"subs":[
{
"nodeId":3892717286
},
{
"nodeId":3892716092,
"subs":[
{
"nodeId":3892715856,
"subs":[
{
"nodeId":3892718592,
"subs":[
{
"nodeId":3892717580
}
]
}
]
}
]
},
{
"nodeId":3892717497
}
]
}
J'ai juste besoin d'un petit indice sur la façon cela peut être de manière itérative.
3 Réponses :
Cela peut être fait avec des générateurs de fonctions.
Peut-être pas l'approche la plus agréable, mais je suis à peu près sûr que les autres solutions impliqueront déjà d'utiliser d'autres moyens, alors voici une solution utilisant des générateurs.
PS: attention à la prise en charge des navigateurs: https: / /developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield
const input = {
"nodeId":3892718504,
"root":true,
"subs":[
{
"nodeId":3892717286
},
{
"nodeId":3892716092,
"subs":[
{
"nodeId":3892715856,
"subs":[
{
"nodeId":3892718592,
"subs":[
{
"nodeId":3892717580
}
]
}
]
}
]
},
{
"nodeId":3892717497
}
]
};
function* nodeLookup(obj) {
if (obj.nodeId) yield obj.nodeId;
if (obj.subs) for (var i = 0; i < obj.subs.length; i++) yield *nodeLookup(obj.subs[i]);
};
const node_ids = [...nodeLookup(input)];
console.log(node_ids);
cela semble être la seule solution qui fera l'affaire pour le moment, merci beaucoup sans votre aide, je serais resté indéfiniment à extraire des données de boucles imbriquées. Je suis également désolé de ne pas avoir publié mes tentatives infructueuses au problème le premier.
@RishabhGusain vous pouvez éviter d'utiliser des générateurs de fonctions en utilisant simplement la récursivité (déjà disponible ci-dessus). J'ai décidé de suivre la fonction * apporach car vous pouvez facilement envelopper le résultat en fonction de vos besoins (dans ce cas, l'opérateur de diffusion ... est utilisé pour accumuler les résultats du générateur de fonctions dans un tableau ). Si vous le souhaitez, vous pouvez transformer le code ci-dessus en supprimant les générateurs de fonctions et en ajoutant manuellement un accumulateur.
@RishabhGusain: c'est bien que vous n'ayez pas posté votre tentative cette fois depuis que vous êtes revenu et l'avez ajoutée ... si vous en tirez des leçons et que vous vous souvenez de le faire à l'avenir.
Cette approche est le mieux conforme au Javascript moderne
C'est simple à faire de manière récursive:
const gatherIds = ({nodeId, subs}, results = []) => subs
? [...results, nodeId, ...(subs .flatMap (sub => gatherIds (sub, results) ))]
: [...results, nodeId]
const response = {"nodeId": 3892718504, "root": true, "subs": [{"nodeId": 3892717286}, {"nodeId": 3892716092, "subs": [{"nodeId": 3892715856, "subs": [{"nodeId": 3892718592, "subs": [{"nodeId": 3892717580}]}]}]}, {"nodeId": 3892717497}]}
console .log (
gatherIds (response)
)
Si vos environnements cibles ne prennent pas en charge flatmap a>, c'est assez facile à caler.
Utilisez simplement la récursivité pour parcourir les sous-marins
var nodeIds = [];
if (data.nodeId) nodeIds.push(data.nodeId);
function fetchNodeIds (subs) {
if (!subs.length) return cb([]);
var abc = [];
subs.forEach(function (sub) {
abc.push(sub.nodeId);
if (sub.subs && sub.subs.length) abc = abc.concat(fetchNodeIds(sub.subs))
});
return abc;
}
nodeIds = nodeIds.concat(fetchNodeIds(data.subs));
console.log('--All nodeIds--', nodeIds)
Bien sûr, mais voyez ma réponse pour une récursion plus simple.
Pouvez-vous nous montrer ce que vous avez essayé d'accomplir cette tâche?
Vous semblez confondre "analyse" et "transformation de la structure de données analysée en une structure de données différente". Vous ne semblez pas non plus avoir fait d'efforts ou fait des recherches sur la façon de procéder.
J'ai essayé d'obtenir des données structurées de ce JSON
s'il vous plaît, je sais que je suis idiot de poser une telle question, mais tout ce dont j'ai besoin est une boucle qui vérifie les sous-titres à chaque itération et