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

标签 jquery recursion

我试图弄清楚如何递归地迭代此 JSON,无论当我获取此数据时存在多少级嵌套,因为嵌套量可以是任意数量。我可以让它深入一层,但似乎无论我做什么,如果我想要额外一层的嵌套,我必须对 child 进行测试,尽管这可能是正确的,但似乎并不正确.

我最终想要的是一个新的数据集,如果当前正在查看的元素有兄弟元素或子元素等,则添加“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. 基本案例
  2. 通过解决“较小”子问题计算出的解决方案

例如,如果您想向每个对象/子对象添加 id 成员,这些是

  1. 如果该值不是对象,则忽略它
  2. 如果它是一个对象,则对其进行标记并检查所有子对象

在代码中

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)。

关于jquery - 如何递归迭代 json 对象/数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19914672/

相关文章:

javascript - 滚动、增长、缩小、随机放置图像选取框?

javascript - 如何将复选框与 jquery 一起使用来获取打印值?

java - 使用递归和回溯找到所有可能的多米诺骨牌链

具有特定深度的 TypeScript 递归类型

python从递归方法返回列表

javascript - AJAX 页面加载后更新 HTML 标题

javascript - 在 div 单击 backbone.js 中的 URLS

jquery - 如何防止 jquery mobile 将其类添加到 html 元素?

ruby - 检测递归调用

c - 如何使用递归构建螺旋方阵?