2016-02-15 4 views
2

Я пытаюсь рекурсивно подсчитывать количество «файлов» в объекте JSON.Javascript recursion reset of count

Вот моя функция,

function totalReports(object, count) { 
    count = count || 0; 

    var key; 
    for(key in object) { 
     if(typeof object[key] == 'object') { 
      if(object[key].type == 'file') { 
      count += 1; 
      console.log(count);    
      } 
      console.log("count");    
      totalReports(object[key], count); 
     } 
    } 
    return count; 
} 

А вот объект JSON,

jsonArray = { 
    "parent":{ 
     "url":"parent.html", 
     "name":"Parent", 
     "children":[ 
     { 
      "type":"folder", 
      "name":"Folder 1", 
      "url":"folder1.html", 
      "children":[ 
       { 
        "type":"file", 
        "name":"File 1", 
        "url":"folder1-file1.html", 
        "children":[ 

        ] 
       }, 
       { 
        "type":"file", 
        "name":"File 2", 
        "url":"folder1-file2.html", 
        "children":[ 

        ] 
       }, 
       { 
        "type":"file", 
        "name":"File 2", 
        "url":"folder1-file3.html", 
        "children":[ 

        ] 
       } 
      ] 
     }, 
     { 
      "type":"folder", 
      "name":"Folder 2", 
      "url":"folder2.html", 
      "children":[ 

      ] 
     }, 
     { 
      "type":"folder", 
      "name":"Folder 3", 
      "url":"folder3.html", 
      "children":[ 
       { 
        "type":"file", 
        "name":"Folder3 File1", 
        "url":"folder3-file1", 
        "children":[ 

        ] 
       }, 
       { 
        "type":"folder", 
        "name":"Folder3 Folder1", 
        "url":"folder3-file1", 
        "children":[ 
        { 
         "type":"folder", 
         "name":"Folder3 Folder1 Folder1", 
         "url":"folder3-folder1-folder1", 
         "children":[ 
          { 
           "type":"file", 
           "name":"Folder3 Folder1 Folder1 File1", 
           "url":"folder3-folder1-folder1-file1", 
           "children":[ 

           ] 
          }, 
          { 
           "type":"file", 
           "name":"Folder3 Folder1 Folder1 File2", 
           "url":"folder3-folder1-folder1-file2", 
           "children":[ 

           ] 
          } 
         ] 
        } 
        ] 
       } 
      ] 
     } 
     ] 
    } 
}; 

И это называется console.log(totalReports(jsonArray)). Он вводит число if в правильное число раз, но оно не удерживает значение, когда оно достигает следующего вспомогательного массива. Ожидаемое значение здесь равно 6, и он вводит в цикл if 6 раз, но не уверен, почему он сбросит значения, когда он выйдет.

Вот скрипку за то же самое, https://jsbin.com/kogoko/edit?js,console,output

Любая помощь будет большим. Заранее спасибо.

+2

'Count = totalReports (объект [ключ], количество);' –

+0

Плюс один, '+ 1'? – JimmyB

+0

@RomanHocke Ах, получил это спасибо :) Вы можете добавить его в качестве ответа. – Stranger

ответ

3

Если вам не нужно count для различных целей, то я предлагаю, чтобы удалить параметр count и просто возвращает локаль count.

function totalReports(object) { 
 
    var count = 0; 
 
    Object.keys(object).forEach(function (key) { 
 
     if (object[key] && typeof object[key] === 'object') { 
 
      if (object[key].type === 'file') { 
 
       count++; 
 
      } 
 
      count += totalReports(object[key]); 
 
     } 
 
    }); 
 
    return count; 
 
} 
 

 
var jsonArray = { "parent": { "url": "parent.html", "name": "Parent", "children": [{ "type": "folder", "name": "Folder 1", "url": "folder1.html", "children": [{ "type": "file", "name": "File 1", "url": "folder1-file1.html", "children": [] }, { "type": "file", "name": "File 2", "url": "folder1-file2.html", "children": [] }, { "type": "file", "name": "File 2", "url": "folder1-file3.html", "children": [] }] }, { "type": "folder", "name": "Folder 2", "url": "folder2.html", "children": [] }, { "type": "folder", "name": "Folder 3", "url": "folder3.html", "children": [{ "type": "file", "name": "Folder3 File1", "url": "folder3-file1", "children": [] }, { "type": "folder", "name": "Folder3 Folder1", "url": "folder3-file1", "children": [{ "type": "folder", "name": "Folder3 Folder1 Folder1", "url": "folder3-folder1-folder1", "children": [{ "type": "file", "name": "Folder3 Folder1 Folder1 File1", "url": "folder3-folder1-folder1-file1", "children": [] }, { "type": "file", "name": "Folder3 Folder1 Folder1 File2", "url": "folder3-folder1-folder1-file2", "children": [] }] }] }] }] } }, 
 
    count = totalReports(jsonArray); 
 

 
document.write(count);

3

Count - это число, которое передается по значению, а не по ссылке в JavaScript. Вам нужно изменить эту строку.

totalReports(object[key], count); 

в

count= totalReports(object[key], count); 
+0

Право, а также передача аргумента count не требуется, что делает код более читаемым. –

+0

Ну, чтобы не передавать аргумент count, ему действительно нужно было бы написать 'count + = totalReports (object [key], count);', но да. Это намного опрятно. – GMchris