2017-02-01 18 views
0

Предположим, что у меня есть следующие JSON:Javascript - Couting все вложенные объекты JSON

{ 
 
    "id": "foo", 
 
    "list": [ 
 
    { 
 
     "id": "A", 
 
     "list": [ 
 
     { 
 
      "id": "B", 
 
      "list": [ 
 
      { 
 
       "id": "C", 
 
       "list": [ 
 
       { 
 
        "id": "D", 
 
        "list": [] 
 
       }, 
 
       { 
 
        "id": "E", 
 
        "list": [] 
 
       } 
 
       ] 
 
      }, 
 
      { 
 
       "id": "F", 
 
       "list": [] 
 
      }, 
 
      { 
 
       "id": "G", 
 
       "list": [ 
 
       { 
 
        "id": "H", 
 
        "list": [] 
 
       }, 
 
       { 
 
        "id": "I", 
 
        "list": [] 
 
       }, 
 
       { 
 
        "id": "J", 
 
        "list": [] 
 
       } 
 
       ] 
 
      } 
 
      ] 
 
     }, 
 
     { 
 
      "id": "K", 
 
      "list": [] 
 
     } 
 
     ] 
 
    }, 
 
    { 
 
     "id": "L", 
 
     "list": [ 
 
     { 
 
      "id": "M", 
 
      "list": [] 
 
     } 
 
     ] 
 
    }, 
 
    { 
 
     "id": "N", 
 
     "list": [] 
 
    }, 
 
    { 
 
     "id": "O", 
 
     "list": [ 
 
     { 
 
      "id": "P", 
 
      "list": [ 
 
      { 
 
       "id": "Q", 
 
       "list": [] 
 
      }, 
 
      { 
 
       "id": "R", 
 
       "list": [] 
 
      }, 
 
      { 
 
       "id": "S", 
 
       "list": [] 
 
      }, 
 
      { 
 
       "id": "T", 
 
       "list": [ 
 
       { 
 
        "id": "U", 
 
        "list": [] 
 
       } 
 
       ] 
 
      }, 
 
      { 
 
       "id": "V", 
 
       "list": [ 
 
       { 
 
        "id": "W", 
 
        "list": [ 
 
        { 
 
         "id": "X", 
 
         "list": [] 
 
        }, 
 
        { 
 
         "id": "Y", 
 
         "list": [] 
 
        }, 
 
        { 
 
         "id": "Z", 
 
         "list": [] 
 
        } 
 
        ] 
 
       } 
 
       ] 
 
      } 
 
      ] 
 
     } 
 
     ] 
 
    } 
 
    ] 
 
}

Мой вопрос: Как я мог рассчитывать каждый из Чайлдс и добавьте этот номер в собственность каждого объекта?

Пример:

  • "C" объект имеет 2 объекта внутри и на подобъектах, "D" и "Е".
  • Объект «W» имеет 3 объекта внутри и на подобъектах «X», «Y» и «Z».
  • «V» имеет ovject (здесь трюк) 4 объектов внутри и на подобъектами, The «W» объект сам и все его Чайлдс (в 3 из них указанные выше).

Относительно этого объект «C» должен иметь свойство, назовем его «allBelow», содержащее номер 2. Объект «W», содержащий 3, и объект «V», содержащий 4. И так on, для каждого объекта.

Интересно, что некоторые рекурсивные функции могут выполнять эту работу, но я не достигаю этого.

Не могли бы Вы помочь мне?

Bests,

ответ

2

var myObj = {"id":"foo","list":[{"id":"A","list":[{"id":"B","list":[{"id":"C","list":[{"id":"D","list":[]},{"id":"E","list":[]}]},{"id":"F","list":[]},{"id":"G","list":[{"id":"H","list":[]},{"id":"I","list":[]},{"id":"J","list":[]}]}]},{"id":"K","list":[]}]},{"id":"L","list":[{"id":"M","list":[]}]},{"id":"N","list":[]},{"id":"O","list":[{"id":"P","list":[{"id":"Q","list":[]},{"id":"R","list":[]},{"id":"S","list":[]},{"id":"T","list":[{"id":"U","list":[]}]},{"id":"V","list":[{"id":"W","list":[{"id":"X","list":[]},{"id":"Y","list":[]},{"id":"Z","list":[]}]}]}]}]}]}; 
 

 
function count(obj) { 
 
    var c = obj.list.length; 
 
    c += obj.list.reduce((a, e) => a + count(e), 0); 
 
    obj.count = c; // assign the count after counting the subobjects. 
 
    return c; // return the count to be used by parent objects 
 
} 
 

 
count(myObj); 
 

 
console.log(myObj);

+0

действительно круто использовать сокращение, gtz – Th0rndike

+0

Спасибо A LOT @ ibrahim-mahrir !!! Это сработало! Теперь я собираюсь потратить некоторое время, чтобы понять это! LOL Тем не менее, я сделал реплику, чтобы уточнить другие пользователи https://repl.it/F3Tk/0 –

+1

@LeandroFerreiraFernandes Добро пожаловать! Они называются ** Функции стрелок **, я только что узнал их несколько дней назад. Они потрясающие. [здесь] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions) - это краткая ссылка о них из mozilla. Когда вы их узнаете, вы узнаете, насколько они классные. –

0

Глубины первый поиск должен работать, я что-то вроде этого (UNTESTED КОДА) мышления:

function DFS(tree){ 
    var currentCount = tree.list.length; 
    for(var i=0;i<count;i++){ 
     currentCount += DFS(tree.list[i]); 
    } 
    tree["count"] = currentCount; 
    return currentCount; 
} 
+0

Это только подсчитывает количество прямых детей – fafl

+0

Это не то, что он просил. См. _ В объекте «V» есть (вот трюк) 4 объекта внутри и на подобъектах, сам объект «W» и все его дочерние элементы (3 из них упомянуты выше) _. –

+0

Я пробовал это, но не работал. –

0

Рекурсивной функцией является хорошей идеей. Попробуйте это:

var data = {"id":"foo","list":[{"id":"A","list":[{"id":"B","list":[{"id":"C","list":[{"id":"D","list":[]},{"id":"E","list":[]}]},{"id":"F","list":[]},{"id":"G","list":[{"id":"H","list":[]},{"id":"I","list":[]},{"id":"J","list":[]}]}]},{"id":"K","list":[]}]},{"id":"L","list":[{"id":"M","list":[]}]},{"id":"N","list":[]},{"id":"O","list":[{"id":"P","list":[{"id":"Q","list":[]},{"id":"R","list":[]},{"id":"S","list":[]},{"id":"T","list":[{"id":"U","list":[]}]},{"id":"V","list":[{"id":"W","list":[{"id":"X","list":[]},{"id":"Y","list":[]},{"id":"Z","list":[]}]}]}]}]}]}; 
 

 
function addCount(node) { 
 
    node.count = 0; 
 
    for (var i = 0; i < node.list.length; i++) { 
 
    var child = node.list[i]; 
 
    addCount(child); 
 
    node.count += child.count + 1; 
 
    } 
 
} 
 

 
addCount(data); 
 
console.log(data)

Он называет себя первым на каждого дочернего узла. Затем он добавляет каждого ребенка к счету как 1 + число внуков (или гранд-грандов или больше).

1

Вы можете сделать простой ДФС:

function appendNumChildren(currentNode) { 
    const totalChildren = currentNode.list.reduce((acc, node) => { 
    return acc + appendNumChildren(node); 
    }, 0) 

    currentNode.allBelow = totalChildren; 

    return totalChildren + 1; 
} 

appendNumChildren(json); 

https://jsbin.com/qekabatuwi/edit?js,console

+0

Он тоже работал = D \ o/ спасибо! –