2016-06-02 5 views
-1

文字列のリストを階層ツリーに変換しようとしています。JSは文字列を階層オブジェクトに分割します

私は次のようになり得るでしょうJSONの例:

{ 
    "log_names": [ 
     "one", 
     "one.one", 
     "one.two", 
     "one.three", 
     "one.three.one", 
     "two", 
     "three", 
     "three.one", 
     "three.one.three.two", 
     "four.one.some.more.stuff" 
    ] 
} 

出力
ここで、各レベルは、オブジェクトであり、各subloggerはそれの親の子です。
各ロガーはオブジェクトであり、サブログである他のオブジェクトを含む可能性があります。また、のようにthree.one.three.twoにはthree.one.threeの下に別のロガーがないので、それは単一のロガーとみなされ、父のロガーではありません。別の例はfour.one.some.more.stuffです。他のロガーがfourの下に存在しないので、私はそれだけで1ロガーですので、(他の人の息子を上記のロジックを実装することの難しさを持っていないし、いないよ

{ 
    "one": { 
     "one": { }, 
     "two": { }, 
     "three": { 
      "one" : { } 
     } 
    }, 
    "two": { }, 
    "three": { 
     "one": { 
      "three.two" : { } 
     } 
    }, 
    "four.one.some.more.stuff" : { } 
} 

以前のように、それだけで同じロジックの下で、単一のロガーになります父のロガー)。

いくつかは助言、あるいはコード例は

+0

うん、いくつかのコード例がいいだろう。あなたは何を試してみてはいかがですか? –

+0

あなたのデータは評価されていません、 '' one.three "'ここで3つは値ですが、次の行では、3つはオブジェクトでなければなりません。 「two」とは何ですか? therはプロパティではありません。 –

+0

この文字列「three.one.three.one」をどのように変換する必要がありますか? – RomanPerekhrest

答えて

1

最後に、このアルゴリズムは、オブジェクト内の既存のキーを探しいいだろうと、新しいオブジェクトを生成しない場合の残りの部分と、次の反復のためにそれを取ります配列をキーとします。

var data = { "log_names": ["one", "one.one", "one.two", "one.three", "one.three.one", "two", "three", "three.one", "three.one.three.two", "four.one.some.more.stuff"] }, 
 
    object = {}; 
 

 
data.log_names.forEach(function (a) { 
 
    var temp = object; 
 

 
    a.split('.').every(function (b, i, bb) { 
 
     if (b in temp) { 
 
      temp = temp[b]; 
 
      return true; 
 
     } 
 
     temp[bb.slice(i).join('.')] = {}; 
 
    }); 
 
}); 
 

 
console.log(object);

+0

事は、それは「1つ」と「1つ」と「1つ2つ」が違うことです。ここでのコンテキストはロガーです。 'one 'はロガーです。 'one.one'と' one.two'はサブログであり、 'one'の子ではあるが別々です。 「one」は「one.one」と「one.two」に依存せず、彼は彼に頼らない。 –

+0

指定されたデータ構造は無効です。どのように私はそれに対処する必要がありますか? –

+0

私の謝罪、私は出力を修正しました。あなたが入力を意味するならば、それは間違いなく有効です。 –