2017-11-27 43 views
4

ネストされた配列/オブジェクトの集合を再帰的に作成する方法の提案はありますか?ネストされた配列を再帰的に作成する

私はユーザーにクイックテキストエリアを使用して複数の要素を追加させています。アスタリスクでサブ項目を示します。だから私はこのような文字列を配列に変換したい。

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

これは私が見たい結果である:

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

挑戦は、私はノードがダウンしに行くの深さを知らないということです。

感謝の意を表します。

+4

...と何をしようとしたある??? –

+0

宿題、ハ! LONG前から恐ろしい記憶を取り戻す。 何が起こっているかは、テキストエリアを介して複数のアイテムを一度に作成できるようにすることです。ネストされたアイテムが必要な場合は、アスタリスクを追加できます。 したがって、入力データは与えられたとおりです。 – 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

関連する問題