2017-01-06 6 views
0

Мне нужно динамически создать вложенный массив в javascript. Массив должен иметь эту структуру.Динамически созданный вложенный массив в javascript

{ 
    "name": "main", 
    "children": [ 
    { 
     "name": "main_topic_1", 
     "children": [ 
     { 
      "name": "sub_topic", 
      "size": 422 
     }, 
     { 
      "name": "sub_topic", 
      "size": 422 
     } 
     ] 
    }, 
    { 
     "name": "main_topic_2", 
     "children": [ 
     { 
      "name": "sub_topic", 
      "size": 422 
     }, 
     { 
      "name": "sub_topic", 
      "size": 422 
     } 
     ] 
    }, 
    { 
     "name": "main_topic_3", 
     "children": [ 
     { 
      "name": "sub_topic", 
      "size": 422 
     }, 
     { 
      "name": "sub_topic", 
      "size": 422 
     } 
     ] 
    } 
    ] 
} 

Мне нужно, чтобы иметь возможность динамически выбирать количество «main_topic_x», а также числа sub_topics, которые принадлежат к этим соответствующим main_topics.

Я пытаюсь что-то вроде этого, но я не знаю, как получить структуру, как указано выше.

main_topics = ['topic 1','topic 2','topic 3']; 
 
    sub_topics = ['subtopic 1','subtopic 2']; 
 

 
    var a = new Array(); 
 
    var b = new Array(); 
 

 
    for(l=0; l<main_topics.length; l++){ 
 
     a[l] = b; 
 
     for(j=0; j<sub_topics.length; j++){ 
 
     b[l] = sub_topics[j]; 
 
     } 
 
    } 
 
    
 
    console.log(JSON.stringify(a, null, 2));

+1

Почему элементы '' main_topics' и sub_topics' включают символ пробела в строке? Где находятся свойства «имя» и «размер», заполненные объектами? – guest271314

+0

Вы снова? lol Со структурой, как у вас есть, вам придется перебирать весь объект, чтобы искать ключ. Если структура не должна быть такой, я бы рекомендовал ее реструктурировать, используя то, что вы хотите в качестве ключа, чтобы вы могли легче ссылаться на нее. – deweyredman

+0

К сожалению, структура должна быть такой, поскольку она подает визуализацию D3. Мне просто нужно иметь возможность динамически устанавливать количество тем и подтемов; Я знаю, как назвать их сейчас. – Cybernetic

ответ

1

Вот что-то я собрал для вас:

var JSON_Object = {name:"main", children:[]}; 
var main_topics = ["main_topic_1", "main_topic_2", "main_topic_3","main_topic_4"]; 
var sub_topics = [ {parent_topic:0, name:"sub_topic_1", size:422}, 
        {parent_topic:0, name:"sub_topic_2", size:422}, 
        {parent_topic:0, name:"sub_topic_3", size:212}, 
        {parent_topic:1, name:"sub_topic_4", size:322}, 
        {parent_topic:1, name:"sub_topic_5", size:422}, 
        {parent_topic:2, name:"sub_topic_6", size:322}, 
        {parent_topic:2, name:"sub_topic_7", size:125}, 
        {parent_topic:3, name:"sub_topic_8", size:422}]; 
for (let i in main_topics) { 
    let tempObj = {name:main_topics[i], children:[]}; 
    for (let j in sub_topics) { 
    if (sub_topics[j].parent_topic==i) { 
     tempObj.children.push({name:sub_topics[j].name,size:sub_topics[j].size}); 
    } 
    } 
    JSON_Object.children.push(tempObj); 
} 
console.log(JSON.stringify(JSON_Object, null, 2)); 
+1

Отлично спасибо. Я должен был внести небольшое изменение, чтобы обрабатывать динамически изменяющееся количество sub_topics, но он отлично работает. Спасибо за попытку! – Cybernetic

0

Я найти самый простой способ, чтобы произвести динамическую структуру данных, чтобы начать производить выходную структуру, и преобразовывать входные структуры инлайн, как это:

var output = { 
    name: 'main', 
    children: main_topics.map(topic => ({ 
    name: topic, 
    children: sub_topics.map(subTopic => ({ 
     name: subTopic, 
     size: 422 
    }) 
    }) 
}; 

Неясно, где вы ожидаете получить size или почему имена в вашем образце не соответствуют тому, что находится в main_topics или sub_topics, но, надеюсь, вы получите идея.

+0

Спасибо за ответ. Я не вижу, как подтемы могут быть разными для каждой темы. Если я чего-то не упущу. – Cybernetic

+0

Ваши исходные данные - это всего лишь массив имен подтегов; неясно, где вы хотите получить эти разные подтемы. Если у вас есть другой источник данных, вы должны добавить к вопросу. – Jacob

Смежные вопросы