2017-11-27 5 views
4

중첩 된 배열/객체 집합을 재귀 적으로 만드는 방법에 대한 제안 사항이 있습니까?중첩 배열을 재귀 적으로 생성

내 사용자가 빠른 텍스트 영역을 사용하여 여러 요소를 추가하도록하고 있습니다. 별표가있는 하위 항목을 나타냅니다. 그래서 저는 배열로 변하기를 원하는이 문자열을 가지고 있습니다.

[ 
    { 
     name: "level 1.1" 
    }, 
    { 
     name: "level 1.2", 
     nodes: [ 
      { 
       name: "level 1.2.1", 
       nodes: [ 
        { 
         name: "level 1.2.1.1" 
        }, 
        { 
         name: "level 1.2.1.2" 
        } 
       ] 
      }, 
      { 
       name: "level 1.2.2" 
      } 
     ] 
    } 
] 

도전은 내가 노드가 내려갈 것이라는 깊이를 알 수 없다는 것입니다 :

level 1.1 
level 1.2 
* level 1.2.1 
** level 1.2.1.1 
** level 1.2.1.2 
* level 1.2.2 

내가보고 싶은 결과이다.

감사의 말을 전하고자합니다.

+4

... 그리고 당신이 뭘하려 ??? –

+0

숙제, 하! 오래 전에 끔찍한 기억을 되살려줍니다. 사람들이 텍스트 영역을 통해 여러 항목을 한 번에 만들 수있는 기회를주었습니다. 중첩 된 항목을 원하면 별표를 추가 할 수 있습니다. 입력 데이터는 주어진대로입니다. – Zagreus

+0

@Zagreus 사용자가 실수 할 여지가 많은 것처럼 들립니다. 중첩 된 구조를 작성하기위한 인터페이스를 사용자에게 제공하는 것이 좋습니다. – JLRishe

답변

3

이것은 재귀없이 선형 접근입니다.

별을 셀 수 있고 주어진 노드의 원하는 수준에 대해이 정보를 가져올 수 있습니다.

이 제안은 마지막으로 삽입 된 레벨에 대한 참조로 배열을 사용하고 원하는 객체 구조를 유지합니다.

이 솔루션은 수준이없는 경우 온 전성 검사를 제공하지 않습니다.

var data = ['level 1.1', 'level 1.2', '* level 1.2.1', '** level 1.2.1.1', '** level 1.2.1.2', '* level 1.2.2'], 
 
    result = [], 
 
    levels = [{ nodes: result }]; 
 

 
data.forEach(function (s) { 
 
    var level = (s.match(/^\*+(?=\slevel)/) || [''])[0].length, 
 
     name = s.match(/[^*]+$/)[0].trim(); 
 

 
    levels[level].nodes = levels[level].nodes || []; 
 
    levels[level].nodes.push(levels[level + 1] = { name: name }); 
 
}); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

정말 고맙습니다. 내가 이해한다면, 당신은 정규 표현식을 사용하여 얼마나 많은 것들이 존재하는지 알아낼 수있다. 빠른 유효성 확인을 통해 누락 된 레벨이 없는지 확인하고 잘 보내야합니다. – Zagreus