Цикл через сложный объект JSON

#javascript #jquery #json #loops

#javascript #jquery #json #циклы

Вопрос:

У меня есть один чрезвычайно сложный объект json, мне нужно записать все свойства и ключи такими, какие они есть. У меня есть концепция, которая просто не может получить выполнение.

Необходимость постоянно вызывать функцию, если у объекта есть объект и так далее. Однако я сталкиваюсь с проблемами, некоторые ключи не выводятся, некоторые значения разбиваются как

 0:h 1:t 2:t 3:p 4: 5:/ 6:/ etc....
name:Travel
scheme:
label:
  

Я предполагаю, что где-то в моем коде есть небольшая ошибка, которую необходимо изменить.

 ObjectValues = function(obj){
for(var j in obj){
   if(typeof(obj[j]) == "object"){
       for(var k in obj[j]){
         ObjectValues(obj[j][k]);
       }
   } else {
       console.log(j   ":"   obj[j]);
   }
}
  

_

 {
"title": "Norway Tourism: Wildlife and Nature",
"author": "",
"categories": [
    {
        "name": "Travel",
        "scheme": "",
        "label": ""
    }
],
"countries": [

],
"content": [
    {
    "thumbnails": [
    {
        "audioChannels": 0,
        "audioSampleRate": 0,
        "bitrate": 0,
        "checksums": {
            "md5": "7089E4E044069AE7702DEC686"
        }
      }
    ]
   }
  ]
}
  

Ответ №1:

 ObjectValues = function(v, k){
  if (typeof v == "object") {
    for (var kp in v) {
      if (Object.hasOwnProperty.call(v, kp)) {
        ObjectValues(v[kp], k != undefined ? k   "."   kp : kp);
      }
    }
  } else {
    console.log(k   ":"   v);
  }
};
  

должно работать даже для значений JSON, которые не являются объектами. Это будет работать для

 ObjectValues(JSON.parse("0"));
  

который не будет обрабатываться оригиналом, и он не будет перебирать символы в строке верхнего уровня, если вы это сделаете ObjectValues("http://...") .

Комментарии:

1. Не удастся напечатать ключ «x», например ObjectValues( { x:{y:"1"} } ) .

2. @frunsi, серьезно? Работает для меня. В каком браузере вы тестируете?

3. Я думаю, он хочет напечатать всю иерархию.

4. @frunsi, я думаю, исправлено. Я все еще не уверен, что именно требуется.

5. Это работает очень хорошо, мне нужно будет немного подправить его, чтобы он не возвращал 0 при вводе другого объекта. Кроме этого, большое спасибо! : D

Ответ №2:

Использование:

 ObjectValues = function(obj) {
    var isArray = obj instanceof Array;
    for (var j in obj) {
        if (obj.hasOwnProperty(j)) {
            if (typeof(obj[j]) == "object") {
                if(!isArray)
                {
                    console.log(j   ":");
                }
                ObjectValues(obj[j]);
            } else if(!isArray) {
                console.log(j   ":"   obj[j]);
            }
        }
    }
}
  

Обратите внимание на удаленный цикл. То, как вы его разделяли, приводило к потере k имен.

Вы также должны использовать свойство hasOwnProperty, чтобы избежать сериализации нежелательных ключей.

Если значение является объектом, вы все равно хотите сериализовать ключ (например, вы не хотите терять foo for {foo: {} } ).

Наконец, мне пришлось выполнить проверку массива, потому что массивы — это объекты, и мы хотим выводить ключи, вложенные в массивы, но мы не хотим выводить сами индексы массива.

Демонстрация в jsFiddle.

Комментарии:

1. Не будет ли это по-прежнему терпеть неудачу ObjectValues("http://...") , как в OP: 0:h 1:t 2:t 3:p 4: 5:/ 6:/ etc.... ?

2. Это было в значительной степени на месте: единственная проблема, заключающаяся в том, что категории по-прежнему возвращаются, как в примере name:Travel scheme: label: , вместо categories: name:Travel scheme: label:

Ответ №3:

Не могу сказать, что это единственная проблема, но вам не хватает запятой после массива стран.

Кроме того, для таких сегментов, как «категории» (и других), вы уверены, что его нужно заключить в квадратные скобки? В терминах JS это массив. Итак, я полагаю, вы говорите, что у вас есть массив, но в данном случае единственным членом этого массива является объект.

Комментарии:

1. Это всего лишь фрагменты гораздо большего файла JSON. Я не контролирую, как он возвращается, извините, если бы я это сделал, не выглядел бы так: D

2. Отлично. Он по-прежнему будет возвращать тип object , но вы должны убедиться, что вы правильно его изучаете. Однако пропущенная запятая является проблемой, поскольку она создает недопустимый JSON.

Ответ №4:

Поскольку на ваш вопрос есть тег jquery:

Я лично использую плагин jquery.dump для таких целей.