Javascript 从列表创建复杂数组

Javascript 从列表创建复杂数组,javascript,arrays,multidimensional-array,Javascript,Arrays,Multidimensional Array,如果我有一个包含许多类似项的数组: [ ["Core", "Mathematics", "Mathematics 20-4"], ["Core", "Mathematics", "Mathematics 30-1"], ["Other", "Fine Arts", "Art", "some art course"], ["Other", "Fine Arts", "Music", "some music course"], ["Other", "Foren

如果我有一个包含许多类似项的数组:

[
    ["Core", "Mathematics", "Mathematics 20-4"],
    ["Core", "Mathematics", "Mathematics 30-1"],
    ["Other", "Fine Arts", "Art", "some art course"],
    ["Other", "Fine Arts", "Music", "some music course"],
    ["Other", "Forensics", "some forensics course"],
    ["French Immersion", "Core", "Mathématiques", "Mathématiques 30-1"]
]
结构基本上是“部门->学科->课程”

我想动态创建一个数组(或对象),类似于以下内容(或任何最有意义的内容)

“其他”部门不一定遵循“主题->课程”,而是可以有“主题->主题->课程”和“主题->课程”。也许添加type=“course”和type=“subject”可能会有所帮助,但我还是希望它有继承权

我一直在思考如何将其动态转换为数组或对象结构

var courses = {};
for(var i =0; i<arr.length; i++){
   var department = arr[i][0];
   var subject = arr[i][1];
   var course = arr[i][2];
   courses[department]= courses[department] || {};
   courses[department][subject] =  courses[department][subject] || [];
   courses[department][subject].push(course);
}
我想这就是你想要的

然后,如果您想要一系列特定主题的课程,例如,您可以使用

var courselist = courses[<department>][<subject];

var courselist=courses[][灵感来源于@ben336、@user1787152,我还提出了以下代码:

var Department,
    departments = [];

Department = function(title) {
    this.title = title;
    this.subjects = [];
};

function parseTitles( titles )
{
    var i, department, departmentTitle,
        hasDepartment = false;

    departmentTitle = titles.shift();

    for (i=0; i<departments.length; i++) {
        if (departments[i].title === departmentTitle) {
            hasDepartment = true;
            break;
        }
    }

    if (!hasDepartment) {
        department = new Department(departmentTitle);
        departments.push(department);
    }

    departments[i].subjects = titles;
}
var部门,
部门=[];
部门=职能(职务){
this.title=标题;
这个。主题=[];
};
函数名称(标题)
{
var i,部门,部门名称,
hasDepartment=false;
departmentTitle=titles.shift();

对于(i=0;考虑到它,其他类别让我头疼。听起来你更希望有人为你编写代码,而不是有特定的问题。你可以尝试创建对象的层次结构,创建对象,如:课程、课程类型、部门、科目和课程,然后将数组条目传递到addCourse函数对基础对象执行操作,并对其进行解析,以决定是将项目添加到层次结构中的现有对象,还是在部门、科目或课程不存在的情况下创建新的项目。最终,您仍将得到所需的树层次结构,但您将能够将问题分解为更易于管理的块。请注意,我假设你问题的最后一行数据是一个输入错误,一个条目中总有3项
var courselist = courses[<department>][<subject];
var Department,
    departments = [];

Department = function(title) {
    this.title = title;
    this.subjects = [];
};

function parseTitles( titles )
{
    var i, department, departmentTitle,
        hasDepartment = false;

    departmentTitle = titles.shift();

    for (i=0; i<departments.length; i++) {
        if (departments[i].title === departmentTitle) {
            hasDepartment = true;
            break;
        }
    }

    if (!hasDepartment) {
        department = new Department(departmentTitle);
        departments.push(department);
    }

    departments[i].subjects = titles;
}