【问题标题】:jQuery traverse json recursivejQuery遍历json递归
【发布时间】:2015-05-11 01:06:34
【问题描述】:

我正在尝试使用 jQuery 递归遍历 JSON 对象。通常它可以工作,但不能在以下 JSON 上。

我要遍历这个JSON,这里我上传了一张图片:

对于我的 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 + "_");
    }
   }
 }

但在尝试构建联系人时该功能失败 > 地址 id 并显示错误消息:

"未捕获的 TypeError: 无法使用 'in' 运算符搜索 'length' in 这个值不能为空。”

希望你们能帮助我增强 jQuery 功能,正如您在这个 json 示例中看到的那样,它并不是 100% 成功的。

问候

【问题讨论】:

  • 不是发布图像,而是发布 JSON 的字符串表示
  • 顺便说一句,这不是一个 jQuery 函数。它只是一个使用一些 jQuery 选择器的纯 JavaScript 编写的递归函数。
  • 是的 Mouser,与我的问题无关 :x 。我知道区别,但是当我写成标题'javascript traverse json'时,有人会说'不,它不仅是一个javascript函数,它还使用jQuery'..认为这是次要优先级,Eyal的回答真的帮助了我。

标签: javascript jquery json recursion


【解决方案1】:

您正在尝试在字符串中搜索属性“length”,但无法完成。在错误的迭代中:callback = obj.contacts.addresses, key = city 然后 callback[key][0] = "This value should not be blank"。
你应该做的是检查你是否在之前寻找“长度”属性,如果你还没有找到一个字符串,则开始递归检查。
在此处查看 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 = callback[key] 而不是 err_msg = callback[key][0]。

【讨论】:

  • "123123".hasOwnProperty('length') // 返回 true
  • @localghost 可以,但是 ("length" in "123123") 会抛出错误。
  • 嗨 Eyal,这也是我昨天晚上也尝试过的,但是通过“=== 'string'”检查,它不再正确地构建我的 id。例如,它不是 id 'ecommerce_form_contact_addresses_0_name',而是为我构建 fieldid:'ecommerce_form_addresses_0_name',对于城市,它构建我而不是 id:'ecommerce_form_contact_addresses_0_cities_0' fieldid:'ecommerce_form_cities_0_0'
  • 问题似乎建立了正确的 id,而不是 "=== 'string'" 检查。任何想法 ?因为在没有字符串检查的错误发生之前,它已经在控制台中锁定了错误的 id:'ecommerce_form_addresses_0_name' 而不是 'ecommerce_form_contact_addresses_0_name'
  • @nova.cp 实际上还有另一个问题可能导致这种情况 - 递归调用中的 while 循环。您已经在循环使用“for key in callback”获得的任何数组,因此没有理由进行 while 循环。您应该将其删除,然后将 callback[key] 发送到递归。您在递归中传递的 id 也存在问题。查看更新的代码。
【解决方案2】:

你为什么不检查

typeof callback[key] === 'array'

改为检查长度属性?

【讨论】:

  • 这将导致无休止的递归。
  • 为什么会导致无限递归,而检查长度不会?从逻辑上讲,您想对数组进行递归并单独处理其他所有内容,不是吗?
猜你喜欢
  • 1970-01-01
  • 2019-08-16
  • 2016-08-25
  • 2018-07-12
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 2013-03-04
相关资源
最近更新 更多