2013-03-11 3 views
0

Если у меня есть массив с большим количеством элементов, подобные этим:Создать сложный массив из списка

[ 
    ["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"] 
] 

Если структура по существу «Department -> Тема -> Курс».

Я хочу, чтобы динамически создать массив (или объект), подобный следующему (или что-то делает больше смысла) ...

{ 
    subjects: [ 
     { 
      title: "Mathematics", courses: [ "Mathematics 20-4", "Mathematics 30-1" ] 
     }, 
     { 
      title: "Mathématiques", lang: "fr", courses: [ "Mathématiques 30-1" ] 
     } 
    ], 
    other: { 
     subjects: [ 
      { 
       title: "Forensics", courses: [ "some forensics course" ] 
      }, 
      { 
       title: "Fine Arts", subjects: [ 
        { 
         title: "Art", courses: [ "some art course" ] 
        }, 
        { 
         title: "Music", courses: [ "some music course" ] 
        } 
       ] 
      } 
     ] 
    } 
} 

«Другие» отдел не обязательно следовать «Тема - > Курс "и скорее может иметь" Тема -> Тема -> Курс "и" Тема -> Курс ". Возможно, добавление типа = "курс" и type = "subject" могло бы помочь, но мне все равно хотелось бы, чтобы у него была иерархия.

Я уже стучал головой о том, как динамически преобразовывать это в структуру массива или объекта.

+0

Эта другая категория дает мне головную боль, думая об этом. – tymeJV

+0

Это похоже на то, что вы хотите, чтобы кто-то написал вам свой код, а не задал конкретный вопрос или проблему. Вы могли бы попытаться создать иерархию объектов, создать такие объекты, как: Курсы, Курс курса, Отдел, Тема и курс, затем передать свой массив в функцию addCourse на базовом объекте и проанализировать его, чтобы решить, следует ли добавлять элементы к существующему объекту в иерархии или создавать новые, если Департамент, Субъект или Курс не существует. Вы по-прежнему окажетесь иерархией деревьев, которую вы хотите там, но вы сможете разбить проблему на более управляемые куски. –

ответ

1
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); 
} 

Это создаст объект в виде

courses = { 
    core:{ 
    mathematics:["math1","math2"], 
    english: ["english1,"english2"] 
    } 
    Other:{ 
    "Fine Arts":[...], 
    "Forensics":[...] 
    } 

} 

который я думаю, что вы хотите.

Затем, если вы хотите массив курсов для конкретного субъекта, например, вы можете получить доступ к нему с

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

Обратите внимание, что я предполагаю, что последняя строка данных в вашем вопросе является опечаткой, и вы всегда будете иметь 3 элемента в записи –

0

Использование вдохновение @ ben336, @ user1787152, а также DevShed forum thread я придумал следующий код:

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; 
} 

Субъекты используются в качестве формы навигации, при этом курсовые вопросы запрашиваются через JSON. Я сохраняю предметы как массив, где при нажатии последнего ребенка в объекте Array он запрашивает JSON для курсов для предмета.

Я посмотрю, могу ли я отдать должное @ ben336, поскольку он отправил единственный ответ, и я хотел бы отдать должное.