2016-04-08 15 views
0

私は多くの異なるcharパターンの配列を与えられています。dataを参照してください。データを階層型JSONフォームにネストして、サンバーストの可視化に挿入しようとしています。各パターンはn文字で構成されていますが、下のパターンは8文字です。希望する結果を話すにはCharのシーケンスから階層JSON-d3.sunburst

  1. レベル0では、いくつのユニークな文字があるかを調べます。答え:['w'、 'm']。
  2. レベル1にあるすべての一意の文字を見つけてレベル2に移動し、パターンの終わりに達するまで末尾のユニークなパターンのサイズを計算します。
  3. 2番目のキー 'm'を2回繰り返します
  4. 結果をchildrenのプロパティrootに挿入します。

私は2レベルのコードを構築することができました。その後、多くのネストで深くなる可能性がありますが、非常にハードコードされ、理解するのは非常に難しいでしょう。誰かがこれを再帰的にやり直す方法や、それを解決する別のパターンを知っていますか?

所望の出力サンプル:

var root = {"name":"evt_seq","children":[{"name":"w","children":[{"name":"w","size":8},{"name":"k","size":1}]},{"name":"m","children":[{"name":"w","size":1}]}]} 

2レベルのネスト(Nレベルのネスティングを探しては)

"use strict"; 
var data = [{"match": ["w", "w", "l", "w", "w", "w", "t", "w"]}, {"match": ["w", "k", "w", "A", "w", "w", "w", "w"]}, 
{"match": ["w", "w", "w", "w", "w", "w", "w", "w"]}, {"match": ["w", "w", "w", "w", "w", "w", "w", "w"]}, 
{"match": ["w", "w", "w", "w", "w", "w", "w", "w"]}, {"match": ["m", "w", "v", "v", "t", "m", "l", "m"]}, 
{"match": ["w", "w", "w", "l", "w", "w", "l", "l"]}, {"match": ["w", "w", "z", "w", "w", "m", "l", "w"]}, 
{"match": ["w", "w", "w", "w", "w", "w", "w", "w"]}, {"match": ["w", "w", "m", "w", "l", "w", "w", "w"]} 
]; 

var root = { 
    "name": "evt_seq", children: [] 
}; 
// Get initial pattern 
var groupedXs = _.groupBy(data, function (d) { 
    return d.match[0]; 
}); 
_.forEach(_.keys(groupedXs), function (d) { 
    let _x = groupedXs[d]; 
    let _groupedXs = _.groupBy(_x, function (f) { 
     return f.match[1]; 
    }); 
    let _children = _.map(_.keys(_groupedXs), function (f) { 
     return {'name': f, 'size': _groupedXs[f].length} 
    }); 
    root.children.push({"name": d, children: _children}); 
}); 
console.log(JSON.stringify(root)); 

答えて

2

これは間違いなく、再帰的なアルゴリズムで最適に解決されます。構文はそれほど重要と思われるので、私はちょうど簡単なpsudeoコードをあげる:

function subTree(inputs) { 
    var children = [] 
    var leadingLetters = //map first letter from each array, remove duplicates 
    for leadingLetter in leadingLetters { 
     var matchingInputs = //filter inputs that match the first letter 
     var reducedInputs = //copy of matchingInputs, but the first (matching) element is removed from each array 
     children.push(subTree(reducedInputs)) 
    } 
    return children 
} 
var root = subTree(data); 

私はあなたが最後に到達したときに何が期待されているか全くわからないように私は、ヌルであるとして、空の子の配列を処理しませんでした弦のいずれにせよ、これはあなたのところにあなたを得るはずです。 (PSは宿題のためではないと思っています!= X)

+0

help @Acey!ありがとうございます! – hotshotiguana

0

@Acey - 偉大なる指針!完全に動作する実装については、以下を参照してください。もう一度ありがとう、それは個人的なプロジェクトのためであり、宿題ではありません:)

function subTree(inputs) { 
    var children = []; 
    var leadingLetters = _.uniq(_.map(inputs, function (d) { 
     return d.match[0]; 
    })); //map first letter from each array, remove duplicates 
    _.forEach(leadingLetters, function (leadingLetter) { 
      var matchingInputs = _.filter(inputs, function (d) { 
       return d.match[0] == leadingLetter; 
      }); //filter inputs that match the first letter 
      var reducedInputs = _.map(matchingInputs, function (d) { 
       return {"match": d.match.slice(1, d.match.length)}; 
      }); //copy of matchingInputs, but the first (matching) element is removed from each array 
      if (!reducedInputs[0].match.length) { 
       children.push({name: leadingLetter, size: reducedInputs.length}); 
      } 
      else { 
       children.push({"name": leadingLetter, children: subTree(reducedInputs)}); 
      } 
     } 
    ); 
    return children 
} 

var root = subTree(data);