2015-03-09 2 views
1

Я пытаюсь пересечь объект JSON с рекурсивным jQuery .. обычно это сработало, но не на следующем JSON.jQuery traverse json recursive

Я хочу, чтобы пройти этот JSON, здесь я загрузил изображение:

enter image description here

Для моих объектов JSON, я имел эту Jquery функцию:

var construct_id = "#ecommerce_form_"; 

// function to traverse json objects given back from Serializer class 
function process(callback, id) { 
    var key; 
    for (key in callback) { 

    // Handle the arrays 
    if ('length' in callback[key]) { 

     // Handle the end - we found a string 
     if (typeof callback[key][0] == "string") { 
      var field_id = construct_id + id + key; 
      var err_msg = callback[key][0]; 

      $(field_id).tooltip('destroy'); 
      $(field_id).tooltip({'title': err_msg}); 
      $(field_id).closest('div[class="form-group"]').addClass('has-error'); 

      console.log(field_id, ":", err_msg); 
     } 
     // Else we found something else, so recurse. 
     else { 
      var i = 0; 
      while (i < callback[key].length) { 
       process(callback[key][i], key + "_" + i + "_"); 
       i++; 
      } 
     } 
    } 

    // Handle the objects by recursing. 
    else { 
     process(callback[key], key + "_"); 
    } 
    } 
} 

Но что функции происходит сбой при попытке для создания идентификатора контакта> адресов с сообщением об ошибке:

"Uncaught TypeError: Cannot use 'in' operator to search for 'length' in This value should not be blank."

Надеюсь, вы, ребята, можете мне помочь улучшить функцию jQuery, она не на 100% успешна, как вы можете видеть на этом примере json.

С уважением

+2

Вместо публикации изображения, строковое представление JSON – hindmost

+0

это не функция jQuery. Это просто рекурсивная функция, написанная на простом JavaScript, которая использует некоторые селектора jQuery. – Mouser

+0

Да Mouser, ничего общего с моей проблемой: x. Я знаю разницу, но когда я написал в качестве заголовка javascript traverse json, кто-то сказал бы: «Нет, это не только функция javascript, но и jQuery». Думайте, что это второстепенный приоритет, ответ Эяля действительно помог мне. –

ответ

1

Вы пытаетесь искать свойства «длина» в строке, которая не может быть сделано. В ошибочной итерации: callback = obj.contacts.addresses, key = cities, а затем callback [key] [0] = "Это значение не должно быть пустым".
Что вы должны сделать, это проверить, достигли ли вы строки до, ища свойство length, и только тогда, если вы не нашли строку, начните проверку рекурсии.
см jsfiddle пример здесь: http://jsfiddle.net/38d15z4o/

var construct_id = "#ecommerce_form_"; 

// function to traverse json objects given back from Serializer class 
function process(callback, id) { 
    var key; 
    for (key in callback) { 
    // Handle the end - we found a string 
    if (typeof callback[key] == "string") { 
     var field_id = construct_id + id + key; 
     var err_msg = callback[key][0]; 
     $(field_id).tooltip('destroy'); 
     $(field_id).tooltip({'title': err_msg}); 
     $(field_id).closest('div[class="form-group"]').addClass('has-error'); 

     console.log(field_id, ":", err_msg); 
    } 
    // Handle the objects and arrays by recursing. 
    else { 
     process(callback[key], id + key + "_"); 
    } 
    } 
} 

Примечание: сообщения об ошибке, вы только показывая первую букву строки, я думаю, что вы имели в виду поставить: ERR_MSG = Обратный вызов [ключ] не ERR_MSG = Обратный вызов [ключ] [0].

+0

«123123» .hasOwnProperty ('length') // возвращает true – localghost

+0

@localghost Да, но («длина» в «123123») выдает ошибку. – Eyal

+0

Действительно. Ты прав. :) – localghost

0

Почему вы не проверить

typeof callback[key] === 'array' 

Вместо проверки свойства длины?

+0

это закончится бесконечной рекурсией. –

+0

Почему это приведет к бесконечной рекурсии при проверке длины, не будет? Логически вы хотите рекурсивно обрабатывать массивы и обрабатывать все остальное отдельно, нет? – SGD