2016-07-01 2 views
1

Я знаю, что есть много вопросов об итерации через объекты JSON, но я не нашел того, что вполне относится к моей точной проблеме. Это JSON, что я пытаюсь перебирать:Как проходить через глубоко вложенные объекты внутри JSON?

psinsights = { 
"kind": "pagespeedonline#result", 
"id": "/speed/pagespeed", 
"responseCode": 200, 
"title": "PageSpeed Home", 
"score": 90, 
"pageStats": { 
    "numberResources": 22, 
    "numberHosts": 7, 
    "totalRequestBytes": "2761", 
    "numberStaticResources": 16, 
    "htmlResponseBytes": "91981", 
    "cssResponseBytes": "37728", 
    "imageResponseBytes": "13909", 
    "javascriptResponseBytes": "247214", 
    "otherResponseBytes": "8804", 
    "numberJsResources": 6, 
    "numberCssResources": 2 
}, 
"formattedResults": { 
    "locale": "en_US", 
    "ruleResults": { 
    "AvoidBadRequests": { 
     "localizedRuleName": "Avoid bad requests", 
     "ruleImpact": 0.0 
    }, 
    "MinifyJavaScript": { 
     "localizedRuleName": "Minify JavaScript", 
     "ruleImpact": 0.1417, 
     "urlBlocks": [ 
     { 
     "header": { 
     "format": "Minifying the following JavaScript resources could reduce their size by $1 ($2% reduction).", 
     "args": [ 
     { 
     "type": "BYTES", 
     "value": "1.3KiB" 
     }, 
     { 
     "type": "INT_LITERAL", 
     "value": "0" 
     } 
     ] 
     }, 
     "urls": [ 
     { 
      "result": { 
     "format": "Minifying $1 could save $2 ($3% reduction).", 
     "args": [ 
      { 
      "type": "URL", 
      "value": "http://code.google.com/js/codesite_tail.pack.04102009.js" 
      }, 
      { 
      "type": "BYTES", 
      "value": "717B" 
      }, 
      { 
      "type": "INT_LITERAL", 
      "value": "1" 
      } 
     ] 
     } 
     }, 
     { 
     "result": { 
     "format": "Minifying $1 could save $2 ($3% reduction).", 
     "args": [ 
      { 
      "type": "URL", 
      "value": "http://www.gmodules.com/ig/proxy?url\u003dhttp%3A%2F%2Fjqueryjs.googlecode.com%2Ffiles%2Fjquery-1.2.6.min.js" 
      }, 
      { 
      "type": "BYTES", 
      "value": "258B" 
      }, 
      { 
      "type": "INT_LITERAL", 
      "value": "0" 
      } 
     ] 
     } 
     } 
     ] 
    } 
    ] 
    }, 
    "SpriteImages": { 
    "localizedRuleName": "Combine images into CSS sprites", 
    "ruleImpact": 0.0 
    } 
    } 
}, 
"version": { 
    "major": 1, 
    "minor": 11 
} 
}; 

Теперь я пытаюсь написать функцию, которая перебирает все объекты ruleResults и возвращает массив свойств localizedRuleName. Согласно JSON, ruleResults имеет три объекта-члена (AvoidBadRequests, MinifyJavaScript и SpriteImages). У каждого из них есть свойство localizedRuleName, к которому я пытаюсь получить доступ, но когда я распечатываю свой массив, он пуст. Вот как я написал свою функцию:

function ruleList(results) { 

    var ruleArray = []; 

    for(var ruleName in results.formattedResults.ruleResults){ 

     ruleArray[counter] = results.formattedResults.ruleResults[ruleName].localizedRuleName; 
    } 

    return ruleArray; 
} 

console.log(ruleList(psinsights)); 

Можете ли вы, ребята, помочь мне попасть на правильный путь? Я использовал в основном этот же метод для итерации через pageStats JSON, и он отлично работал. Я не уверен, почему я не могу заставить его работать с этими более глубокими вложенными объектами и свойствами.

+3

Вы не дают значение 'counter' –

ответ

1

Ваша проблема не в вашей итерации, а в вашей неопределенной переменной «счетчик». Вместо того, чтобы использовать счетчик может использовать функцию "PUSH":

function ruleList(results) { 

    var ruleArray = []; 

    for(var ruleName in results.formattedResults.ruleResults){ 

     ruleArray.push(results.formattedResults.ruleResults[ruleName].localizedRuleName); 
    } 

    return ruleArray; 
} 

скрипки: https://jsfiddle.net/fo9h56gh/

Надеется, что это помогает.

+0

Упс я имел в виду, чтобы считать, что счетчик, когда я первый отправил свой код! Счетчик на самом деле не работал для меня. Я просто попробовал ваше решение, но по какой-то причине он просто распечатывает пустой массив. Просто чтобы узнать, что такое ruleName, я зарегистрировал его и правильно изменил с AvoidBadRequests на MinifyJavaScript на SpriteImages. Я просто не могу обдумать, почему мой код не будет захватывать каждое localizedRuleName и добавлять его в массив:/ – ccmetz92

+0

Хорошо, это странно ... когда я запускаю ваш код в jsfiddle, он работает! Но когда я запускаю мой в окне браузера, это не так. – ccmetz92

+0

mh, в этом случае я не могу помочь :(можете ли вы попытаться создать скрипку, которая воспроизводит вашу проблему? –

0

вы, вероятно, получаете ошибку javascript, так как счетчик не определен. Вы можете попробовать это:

function ruleList(results) { 

    var ruleArray = []; 
    var counter = 0; 

    for(var ruleName in results.formattedResults.ruleResults){ 

    ruleArray[counter] = results.formattedResults.ruleResults[ruleName].localizedRuleName; 

    counter++; 
    } 

    return ruleArray; 
} 
Смежные вопросы