遍历嵌套JavaScript对象的更好方法

遍历嵌套JavaScript对象的更好方法,javascript,loops,object,nested,Javascript,Loops,Object,Nested,我正在努力安排以下obj中所有课程的时间表: {"COSC1121":{ "name":"Course 1 name", "color":"#1ABC9C", "type":{ "lecture":{ "0":{ "building":"31", "day":0, "starttime":1, "endti

我正在努力安排以下obj中所有课程的时间表:

{"COSC1121":{
    "name":"Course 1 name",
    "color":"#1ABC9C",
    "type":{
        "lecture":{
            "0":{
                "building":"31",
                "day":0,
                "starttime":1,
                "endtime":3
            }
            "1":{
                "building":"95",
                "day":3,
                "starttime":6,
                "endtime":8
            }
        }
    },
    "priority":0,
    "arranged":true
},
"POPP1112":{
    "name":"Course 2 name",
    "color":"#1ABC9C",
    "type":{
        "lecture":{
            "0":{
                "building":"71",
                "day":2,
                "starttime":2,
                "endtime":4
            }
        },
        "tutorial":{
            "0":{
                "building":"13",
                "day":3,
                "starttime":1,
                "endtime":3
            }
            "1":{
                "building":"80",
                "day":3,
                "starttime":2,
                "endtime":5
            }
            "2":{
                "building":"56",
                "day":3,
                "starttime":7,
                "endtime":9
            }
        }
    },
"priority":1,
"arranged":true
}
}
每个课程有多个不同的班级类型,每个班级类型有多个选项(具有不同的建筑、日期、开始时间、结束时间)。但每个课程的每个类型只有一个选项可安排在时间表中

例如:课程代码COSC1211只有一种类型是讲座,而本讲座有2个选项=>仅安排其中的1个选项

我所尝试的:

$.each(that_obj, function(i){

    var this_c_code = that_obj[i].code,
        this_c_name = that_obj[this_c_code].name,
        this_c_color = that_obj[this_c_code].color;

        that_obj[this_c_code].arranged = true;

        $.each( that_obj[this_c_code].type, function(ii) {

            // ii now is the string of course_type (lecture...)

            $.each( that_obj[this_c_code].type[ii], function(iii) {

                // Create short name
                var this_temp_class_opt = that_obj[this_c_code].type[ii][iii];

                var update_result = c_set_timetable_occupy( this_temp_class_opt, this_c_name, this_c_code, ii, this_c_color );

                // Check the update_result and add this class option into another object
                ...
            });
        });
    });
这是一个代码块,只需循环通过该对象并排列每个类类型的第一个选项。它很好用

现在,我想让它循环通过所有可能的安排(所有可能),如:

1/选择COSC1121->第0课,其余部分选择第1选项

2/选择COSC1121->讲座1

3/

n/选择COSC1121->第0课和第1112课->教程1(第2选项)

等等

现在我被困在这个问题上了。如有任何建议,我们将不胜感激

谢谢

p/S:输出格式应与原始对象格式相同,只需去掉未选择的选项即可。例如:

{
    0: {
        "COSC1121":{
            "name":"Course 1 name",
            "color":"#1ABC9C",
            "type":{
                "lecture":{
                    "0":{
                        "building":"31",
                        "day":0,
                        "starttime":1,
                        "endtime":3
                    }
                }
            }
        },
        "POPP1112":{
            "name":"Course 2 name",
            "color":"#1ABC9C",
            "type":{
                "lecture":{
                    "0":{
                        "building":"71",
                        "day":2,
                        "starttime":2,
                        "endtime":4
                    }
                },
                "tutorial":{
                    "0":{
                        "building":"13",
                        "day":3,
                        "starttime":1,
                        "endtime":3
                    }
                }
            }
        }
    },
    1: {
        "COSC1121":{
            "name":"Course 1 name",
            "color":"#1ABC9C",
            "type":{
                "lecture":{
                    "1":{
                        "building":"95",
                        "day":3,
                        "starttime":6,
                        "endtime":8
                    }
                }
            }
        },
        "POPP1112":{
            "name":"Course 2 name",
            "color":"#1ABC9C",
            "type":{
                "lecture":{
                    "0":{
                        "building":"71",
                        "day":2,
                        "starttime":2,
                        "endtime":4
                    }
                },
                "tutorial":{
                    "0":{
                        "building":"13",
                        "day":3,
                        "starttime":1,
                        "endtime":3
                    }
                }
            }
        }
    },
    2: {
        "COSC1121":{
            "name":"Course 1 name",
            "color":"#1ABC9C",
            "type":{
                "lecture":{
                    "0":{
                        "building":"31",
                        "day":0,
                        "starttime":1,
                        "endtime":3
                    }
                }
            }
        },
        "POPP1112":{
            "name":"Course 2 name",
            "color":"#1ABC9C",
            "type":{
                "lecture":{
                    "0":{
                        "building":"71",
                        "day":2,
                        "starttime":2,
                        "endtime":4
                    }
                },
                "tutorial":{
                    "1":{
                        "building":"80",
                        "day":3,
                        "starttime":2,
                        "endtime":5
                    }
                }
            }
        }
    },
    3: {
        "COSC1121":{
            "name":"Course 1 name",
            "color":"#1ABC9C",
            "type":{
                "lecture":{
                    "0":{
                        "building":"31",
                        "day":0,
                        "starttime":1,
                        "endtime":3
                    }
                }
            }
        },
        "POPP1112":{
            "name":"Course 2 name",
            "color":"#1ABC9C",
            "type":{
                "lecture":{
                    "0":{
                        "building":"71",
                        "day":2,
                        "starttime":2,
                        "endtime":4
                    }
                },
                "tutorial":{
                    "2":{
                        "building":"56",
                        "day":3,
                        "starttime":7,
                        "endtime":9
                    }
                }
            }
        }
    }
}

我对你可能需要什么略知一二。您似乎需要类之间所有选项的可能组合。为了在我写答案之前进行验证,你能创建一个json对象作为输出吗?嗨@CharlieH,请参考我上面编辑的帖子。谢谢您的输入和输出之间的唯一区别是输出中没有任何项目超出“类型”下的第0项。所以,基本上你需要遍历对象并删除所有附加项-但保留第0项?@CharlieH,不,不,可能这里有误解。in和output之间的区别在于,输出不包含未选择的类类型(剥离)。因此,输出是一个更大的obj,包含所有可能性,每个可能性都是输入objYa的副本(简化),我看到注释
//第二种可能性
。请给我看看这些可能性。