1

我阅读了很多关于如何处理从 Ajax 函数返回的 JSON 数组的搜索结果,但似乎没有一个适合我的问题。

说明:我有效地在树状结构中搜索数据库,以返回给定元素的所有子元素。可能有 1 到数百个结果。所有这些繁重的工作都是在 PHP 中完成的,然后返回一个包含结果的 JSON 数组,但是,我似乎无法弄清楚如何迭代结果,如下所示:

{ 
  "Kaz1Kid43343757245": {
    "kaz1KidKid24572649":[],
    "kaz1KidKid24572649Back":[]
  },
  "Kaz1Kid43343757245Back":[]
}

请注意,每个项目都需要作为单独的 ID 返回,但如果我尝试

$.each(obj, function(key, val)
{
    //doing stuff with each item
});

我在键中只得到了两个结果(Kaz1Kid43343757245 和 Kaz1Kid43343757245Back),而 val 什么也没显示。

我究竟做错了什么?

干杯

MVK

4

3 回答 3

2

您需要递归到数组中。您的代码只查看第一级,但正如您自己所说:它是一个树结构。所以如果一个元素是一个数组,你需要进去并再次取出你的值,如果这些是数组,你需要......

于 2012-06-14T23:15:04.020 回答
1

让我们用适当的缩进重写 Object 字面量:

{
  "Kaz1Kid43343757245": {
    "kaz1KidKid24572649": [],
    "kaz1KidKid24572649Back": []
  },
  "Kaz1Kid43343757245Back": []
}

我认为现在很明显为什么循环只迭代两个属性。您将需要重组生成的 JSON。

于 2012-06-14T23:16:16.573 回答
1

这是一个递归函数的示例,它将向下循环到它遇到的对象或将键/值添加到一个新的平面对象:

function flatten(obj) {
    var result = {};

    function list(node) {
        $.each(node, function(key, val){
            if (jQuery.isPlainObject(val)) {
                list(val);
            } else {
                result[key] = val;
            }
        });
    }

    list(obj);
    return result;
}

http://jsfiddle.net/userdude/nssvk/

或者运行第一个调用的更高级的方式:

http://jsfiddle.net/userdude/nssvk/1/

这使:

{
    "Kaz1Kid43343757245Back" : []
    "kaz1KidKid24572649"     : []
    "kaz1KidKid24572649Back" : []
}

问题是,您想如何处理Kaz1Kid43343757245示例对象中的“扁平化”键?

于 2012-06-15T00:20:23.750 回答