【问题标题】:each within each within each各内各内各
【发布时间】:2012-08-29 13:28:34
【问题描述】:

我是使用 JSON 和 getJSON 函数等的新手,我正在尝试从 JSON 中获取数据,该 JSON 下降了几个级别并且可以有多个子级。此刻,我可以通过将 .each 与另一个 .each 一起使用来查看我想要的值,例如:

$.each(data, function(i, value1) {
    $.each(value1, function(i, value2) {
        $.each(value2, function(i, value3) {
            $.each(value3, function(i, value4) {
                $.each(value4, function(i, value5) {
                    $.each(value5, function(i, value6) {
                        alert ("we got "+i);
                    });

唯一的问题是,我并不总是知道 JSON 中的内容,而且它可能有无限的孩子​​。那么我该如何让它变得如此动态呢?

基本上我正在寻找的是不断检查孩子直到达到最低水平的东西。

另外,我知道最后的值 i 是 JSON 中任何值的索引,

是否有任何方法可以自动执行此操作,以便我可以检查 JSON 中的“名称”并返回“名称”的值?

这是我尝试使用的 JSON 示例:

[
 {
   "children": [
    {
      "children": [
       {
        "children": [
          {
            "children": [
              {
                "bucketPath": "AUDIO\\audio0.mp3",
                "id": 305,
                "modified": "2012-08-02T10:06:52",
                "name": "audio0.mp3",
                "state": "closed"
              }

【问题讨论】:

  • 您能提供一些示例 json 吗?
  • 向我们展示 JSON。你说的“名字”是什么意思?
  • 我假设您的意思类似于 XPath //name 查找,那么 this thread 可能会有所帮助?

标签: javascript jquery json


【解决方案1】:

使用递归:

function recurse(name, obj) {
    if (!obj || typeof obj != "object")
        alert("found leaf '"+name+"': "+obj);
    else
        $.each(obj, recurse);
}
recurse("root", data);

编辑:根据您的 JSON,可以使其更具体:

function recurse(arr) {
   for (var i=0; i<arr.length; i++)
       for (var prop in arr[i])
           if (prop == "children") // && arr[i].children instanceof Array
               recurse(arr[i].children);
           else
               alert("we got "+prop+": "+arr[i][prop]);
}
recurse(data);

【讨论】:

  • @pimvdb:谢谢。我知道我最初想使用Object(obj)!==obj 是有原因的 :-)
  • 我认为这可能正是我正在寻找的内容,我会尝试将其合并到我的脚本中,看看我会得到什么结果。谢谢。
  • 非常感谢这个,几乎就在那里。只是为了让我更好地理解它,函数调用中的“root”有什么意义?留在里面时,它会遍历单词“root”中的每个字母。
  • 我认为他应该选择recursion
  • @RoverK:由于$.each 的工作方式,第一个函数需要一个名称作为第一个参数。然后它可以记录属性名称
【解决方案2】:

这听起来像是需要JPathJSONPath

var name = jpath(data, '//name');

【讨论】:

    【解决方案3】:

    当 JSON 变得像这样有点复杂时,我认为 dojo 的 JSONQuery 是一个很好的解决方案。如果您熟悉它,它类似于 XPath。查询可能会变得相当复杂,但这里有一个查询示例,用于在任意深度搜索具有给定名称的属性:

    var results = dojox.json.query("..property_name", json_data);
    

    这里有一篇很好的文章详细介绍了dojo的JSONQuery的使用:http://www.sitepen.com/blog/2008/07/16/jsonquery-data-querying-beyond-jsonpath/

    【讨论】:

    • 谢谢,但是我正在尽力不使用外部库。我将不得不稍后对其进行自定义,并希望它尽可能简单。不幸的是,我的知识还没有延伸到 XPath。
    • 这对我来说听起来很公平。那么,我肯定会选择@Bergi 的解决方案。
    • @RoverK 我链接到的 JPath 和 JSONPath 库都非常短,并且使像这样的遍历结构变得非常简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 2012-06-30
    • 2015-05-31
    • 2019-02-08
    • 1970-01-01
    相关资源
    最近更新 更多