2016-06-22 4 views
0

Я мог бы писать сокращенные объекты, но тогда у меня будет тонна отступов других массивов и объектов внутри. Это для формы вопроса со многими ветвями новых наборов вопросов, основанных на последнем, который был рассмотрен. Любые предложения о том, как этот код должен быть разработан?Лучший способ создания множества ветвящихся массивов в JavaScript

+0

Важно то, как данные изложены. Если все вопросы уникальны на основе предыдущего ответа, у вас нет слишком большого выбора, кроме того, что вы изначально предложили. Если некоторые вопросы приводят к тем же путям, вам понадобится более сложная структура данных, такая как ориентированный граф. Но Stack Overflow на самом деле не предназначен для мозгового штурма структур данных, он предназначен для решения строго определенных проблем. Посмотрите на ориентированные графики и построение графика. [Вот сообщение в диалоговом окне] (http://gamedev.stackexchange.com/questions/40519/how-do-dialog-trees-work), который в основном вы делаете. –

ответ

1

Используйте древовидную структуру, как это:

var 
n0 = {/*data*/}, 
n1 = {/*data*/}, 
... 
n3234 = {/*data*/} 
n0.children = [n1, n2, n3] 
n1.children = [n11, n12, n13] 
... 
n3234.children = [] 

При повторном использовании поддеревьев, просто сделать это:

n2321 = n1234, 

Избегайте циклов, как это:

n2222 = n2, 
... 
n1111.children = [n1] 
+0

Одна вещь, которую я не понимаю в вашем примере, состоит в том, что в ней перечислены дети, которые еще не определены. – VagueExplanation

+0

@VagueExplanation исправлено, извините ;-) –

1

Другое решение с меньшим типирования :

var d = { 
'': {/*data*/}, 
'1': {/*data*/}, 
'1.1': {/*data*/}, 
.. 
'3.2.3.4': {/*data*/} 
} 
for(var k in d){//init child array 
    d[k].children = [] 
} 
for(var k in d){//build tree structure 
    if(k != ''){//skip root 
    var a = k.split('.')//hierarchy array 
    var i = a.pop()//remove my level 
    var parent = a.join('.') 
    if(parent in d){//parent exists 
     d[parent].children.push({i: +i, k: k})//to prevent holes 
    } 
    else { 
     console.log('pending subtree: ' + k) 
    } 
    } 
} 
for(var k in d){//transform child array 
    d[k].children = d[k].children 
    .sort(function(a, b){return a.i - b.i})//es6 (a, b)=>a.i-b.i 
    .map(function(x){return d[x.k]})//es6 x=>d[x.k] 
} 
//now the tree is in d[''] 
+0

Ошибка в предотвращении дыр. (undefined не является объектом (оценка «d [родительский] .children.push»)). Что должно там быть? – VagueExplanation

+0

Добавлена ​​инициализация дочернего массива @VagueExplanation и исправлено присоединение. Это не проверенный код, вы должны его завершить самостоятельно ... –