如何递归迭代json对象/数组

时间:2013-11-11 19:52:32

标签: jquery recursion

我试图找出如何递归迭代这个JSON,无论我得到这些数据时有多少级别的嵌套,因为嵌套量可以是任何数量。我可以让它达到一个深度,但似乎无论我做什么,如果我想要一个额外的嵌套水平,我必须为儿童进行测试,虽然这可能是正确的,但它似乎不是

我想最终得到的是一个新的数据集,如果正在查看的当前元素有一个兄弟或者有一个孩子等,则添加了'next_id'。

我很困惑,所以我希望这是有道理的。

我试过这个:

    function visit(obj){
var msg = '';
for(var prop in obj){
    if(typeof(obj[prop]) == 'object'){
        if(Object.prototype.toString.call(obj[prop]) == '[object Array]'){
            for(var i = 0; i < obj[prop].length; i++){
                msg += "the element " + prop + " (array) was visited: " + obj[prop][i].key + "\n";
                if (  obj[prop][i].children )
                {
                    msg += "the element " + prop + " (array-CHILDREN) was visited: " + obj[prop][i].key + "\n";
                    for ( y=0;y<obj[prop][i].children.length;y++ )
                    {
                        msg += "the element " + prop + " (array-HELLO) was visited: " + obj[prop][i].children[y].title + "\n";
                        if (  obj[prop][i].children[y].children )
                        {
                            msg += "the element " + prop + " (array-HELLO-CHILD) was visited: " + obj[prop][i].children[y].title + "\n";
                            $.each(obj[prop][i].children[y].children, function( index, value ) {
                                alert( "red alert " + value.title );
                                msg += "the element " + prop + " (CHILD-CHILD) was visited: " + i + ": " + index + ": " + value.title + "\n";
                                visit(value);  
                            });
                        }

                    }
                }
            }
        }else{
            msg += "the element " + prop + " (object) was visited"  + "hello" + "\n";
            visit(obj[prop]);
        }
    }else{
        msg += "the element " + prop + " = " + obj[prop] + " was visited"  + "\n";
    }
}
return msg;

}

我称之为: 访问(d)其中“d”是以下数据。

提前感谢您的帮助。

所以,这是我的数据:

    {
"key": "root_1",
"title": "root",
"children": [
    {
        "key": "1",
        "title": "Title Goes Here",
        "data": {
            "can_drag": false,
            "can_drop": false
        }
    },
    {
        "folder": false,
        "key": "_1",
        "title": "Text for regular step goes here",
        "data": {
            "step_type": "span",
            "imagePath": "images/",
            "icon": "text_align_center.png",
            "can_drag": true,
            "can_drop": [
                "before",
                "after"
            ]
        }
    },
    {
        "folder": false,
        "key": "_2",
        "title": "Text for regular step goes here",
        "data": {
            "step_type": "span",
            "imagePath": "images/",
            "icon": "text_align_center.png",
            "can_drag": true,
            "can_drop": [
                "before",
                "after"
            ]
        }
    },
    {
        "expanded": true,
        "folder": true,
        "key": "_3",
        "title": "Fork question here",
        "data": {
            "step_type": "fork",
            "imagePath": "images/",
            "icon": "fork.gif",
            "can_drag": true,
            "can_drop": false
        },
        "children": [
            {
                "expanded": true,
                "key": "_4",
                "title": "branch 1 answer text",
                "data": {
                    "step_type": "fork_branch",
                    "imagePath": "images/",
                    "icon": "arrow_right.png",
                    "can_drag": true,
                    "can_drop": false
                },
                "children": [
                    {
                        "key": "_5",
                        "title": "branch 1 answer text first step",
                        "data": {
                            "imagePath": "images/",
                            "icon": "text_align_center.png",
                            "step_type": "step",
                            "can_drag": true,
                            "can_drop": false
                        }
                    },
                    {
                        "expanded": true,
                        "folder": true,
                        "key": "_8",
                        "title": "Fork question here",
                        "data": {
                            "step_type": "fork",
                            "imagePath": "images/",
                            "icon": "fork.gif",
                            "can_drag": true,
                            "can_drop": false
                        },
                        "children": [
                            {
                                "expanded": true,
                                "key": "_9",
                                "title": "branch 1 answer text",
                                "data": {
                                    "step_type": "fork_branch",
                                    "imagePath": "images/",
                                    "icon": "arrow_right.png",
                                    "can_drag": true,
                                    "can_drop": false
                                },
                                "children": [
                                    {
                                        "key": "_10",
                                        "title": "branch 1 answer text first step",
                                        "data": {
                                            "imagePath": "images/",
                                            "icon": "text_align_center.png",
                                            "step_type": "step",
                                            "can_drag": true,
                                            "can_drop": false
                                        }
                                    },
                                    {
                                        "expanded": true,
                                        "folder": true,
                                        "key": "_13",
                                        "title": "Fork question here",
                                        "data": {
                                            "step_type": "fork",
                                            "imagePath": "images/",
                                            "icon": "fork.gif",
                                            "can_drag": true,
                                            "can_drop": false
                                        },
                                        "children": [
                                            {
                                                "expanded": true,
                                                "key": "_14",
                                                "title": "branch 1 answer text",
                                                "data": {
                                                    "step_type": "fork_branch",
                                                    "imagePath": "images/",
                                                    "icon": "arrow_right.png",
                                                    "can_drag": true,
                                                    "can_drop": false
                                                },
                                                "children": [
                                                    {
                                                        "key": "_15",
                                                        "title": "branch 1 answer text first step",
                                                        "data": {
                                                            "imagePath": "images/",
                                                            "icon": "text_align_center.png",
                                                            "step_type": "step",
                                                            "can_drag": true,
                                                            "can_drop": false
                                                        }
                                                    },
                                                    {
                                                        "folder": false,
                                                        "key": "_19",
                                                        "title": "End script text goes here",
                                                        "data": {
                                                            "step_type": "end",
                                                            "imagePath": "images/",
                                                            "icon": "text_align_center.png",
                                                            "can_drag": true,
                                                            "can_drop": false
                                                        }
                                                    }
                                                ]
                                            },
                                            {
                                                "expanded": true,
                                                "key": "_16",
                                                "title": "branch 2 answer text",
                                                "data": {
                                                    "step_type": "fork_branch",
                                                    "imagePath": "images/",
                                                    "icon": "arrow_right.png",
                                                    "can_drag": true,
                                                    "can_drop": false
                                                },
                                                "children": [
                                                    {
                                                        "key": "_17",
                                                        "title": "branch 2 answer text first step",
                                                        "data": {
                                                            "imagePath": "images/",
                                                            "icon": "text_align_center.png",
                                                            "step_type": "step",
                                                            "can_drag": true,
                                                            "can_drop": false
                                                        }
                                                    },
                                                    {
                                                        "folder": false,
                                                        "key": "_20",
                                                        "title": "Text for regular step goes here",
                                                        "data": {
                                                            "step_type": "span",
                                                            "imagePath": "images/",
                                                            "icon": "text_align_center.png",
                                                            "can_drag": true,
                                                            "can_drop": [
                                                                "before",
                                                                "after"
                                                            ]
                                                        }
                                                    },
                                                    {
                                                        "folder": false,
                                                        "key": "_21",
                                                        "title": "End script text goes here",
                                                        "data": {
                                                            "step_type": "end",
                                                            "imagePath": "images/",
                                                            "icon": "text_align_center.png",
                                                            "can_drag": true,
                                                            "can_drop": false
                                                        }
                                                    }
                                                ]
                                            }
                                        ]
                                    }
                                ]
                            },
                            {
                                "expanded": true,
                                "key": "_11",
                                "title": "branch 2 answer text",
                                "data": {
                                    "step_type": "fork_branch",
                                    "imagePath": "images/",
                                    "icon": "arrow_right.png",
                                    "can_drag": true,
                                    "can_drop": false
                                },
                                "children": [
                                    {
                                        "key": "_12",
                                        "title": "branch 2 answer text first step",
                                        "data": {
                                            "imagePath": "images/",
                                            "icon": "text_align_center.png",
                                            "step_type": "step",
                                            "can_drag": true,
                                            "can_drop": false
                                        }
                                    },
                                    {
                                        "folder": false,
                                        "key": "_22",
                                        "title": "End script text goes here",
                                        "data": {
                                            "step_type": "end",
                                            "imagePath": "images/",
                                            "icon": "text_align_center.png",
                                            "can_drag": true,
                                            "can_drop": false
                                        }
                                    }
                                ]
                            }
                        ]
                    }
                ]
            },
            {
                "expanded": true,
                "key": "_6",
                "title": "branch 2 answer text",
                "data": {
                    "step_type": "fork_branch",
                    "imagePath": "images/",
                    "icon": "arrow_right.png",
                    "can_drag": true,
                    "can_drop": false
                },
                "children": [
                    {
                        "key": "_7",
                        "title": "branch 2 answer text first step",
                        "data": {
                            "imagePath": "images/",
                            "icon": "text_align_center.png",
                            "step_type": "step",
                            "can_drag": true,
                            "can_drop": false
                        }
                    },
                    {
                        "folder": false,
                        "key": "_18",
                        "title": "End script text goes here",
                        "data": {
                            "step_type": "end",
                            "imagePath": "images/",
                            "icon": "text_align_center.png",
                            "can_drag": true,
                            "can_drop": false
                        }
                    }
                ]
            }
        ]
    }
]

}

1 个答案:

答案 0 :(得分:4)

要使用递归,您需要能够根据

描述问题
  1. 基本案例
  2. 通过解决“较小”子问题计算的解决方案
  3. 例如,如果您想为每个对象/子对象添加id成员,则

    1. 如果值不是对象,则忽略它
    2. 如果是对象,则标记它并检查所有子对象
    3. 代码

      var next_id = 0;
      function tag_value(x) {
          if (typeof x == "object") {
              x.id = ++next_id; // Add the tag
              for (var attr in x) {
                  // Recursive call to solve the "smaller" problem
                  tag_value(x[attr]);
              }
          } else {
              // Not an object, ignore
          }
      }
      

      这当然是一个非常简化的示例,您肯定需要添加一个对要标记的对象类型的检查(例如null被视为“对象”,但您无法添加属性它)。如果传递的值不是树而是循环图(例如a.xbb.ya),您也会遇到问题。