我试图弄清楚如何递归地迭代此 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
}
}
]
}
]
}
]
}
最佳答案
要使用递归,您需要能够用以下方式描述问题
- 基本案例
- 通过解决“较小”子问题计算出的解决方案
例如,如果您想向每个对象/子对象添加 id
成员,这些是
- 如果该值不是对象,则忽略它
- 如果它是一个对象,则对其进行标记并检查所有子对象
在代码中
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.x
是 b
且 b.y
是a
)。
关于jquery - 如何递归迭代 json 对象/数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19914672/