Как разобрать JSON с вложенными массивами в javascript или jquery - PullRequest
1 голос
/ 18 июня 2019

Я хочу проанализировать JSON, как показано ниже

{
   "nodeId":3892718504,
   "root":true,
   "subs":[
      {
         "nodeId":3892717286
      },
      {
         "nodeId":3892716092,
         "subs":[
            {
               "nodeId":3892715856,
               "subs":[
                  {
                     "nodeId":3892718592,
                     "subs":[
                        {
                           "nodeId":3892717580
                        }
                     ]
                  }
               ]
            }
         ]
      },
      {
         "nodeId":3892717497
      }
   ]
}

Каждый узел может иметь подпрограммы, и эти подпрограммы могут иметь узлы, которые могут иметь свои собственные подпрограммы.все, что я хочу, это массив, имеющий все nodeId, как я могу проанализировать этот JSON так, чтобы массив с именем node_list заполнялся всем nodeId.Я могу использовать javascript или jquery.

Я пытаюсь использовать следующий подход, чтобы получить массив nodeId

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)
        }
    }
  }
});

Мне просто нужен небольшой совет о том, как это может быть итеративным образом.

Ответы [ 3 ]

4 голосов
/ 18 июня 2019

Это можно сделать с помощью генераторов функций.

Возможно, это не самый приятный подход, но я уверен, что другие решения уже предполагают использование других способов, поэтому вот решение с использованием генераторов.

PS: Остерегайтесь поддержки браузера: 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);
2 голосов
/ 18 июня 2019

Просто используйте рекурсию для итерации по подпрограммам

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)
1 голос
/ 18 июня 2019

Это просто сделать рекурсивно:

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)
)

Если ваша целевая среда не поддерживает flatmap, шим достаточно легко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...