2016-05-12 10 views
2

アプリでは、ユーザーごとにクリックイベントを1日に記録しています。これらをd3で視覚化したいと思います。 折れ線グラフには、すべてのユーザーの行が表示されます。 y軸はクリックの合計、x軸は日です。 ユーザーはアプリを使用しないため、その日のデータはありません。 しかし、d3では、すべての配列の長さが同じで、同じデータ構造を持つことを要求しています。どうすればギャップを効率的に埋めることができますか?複数の配列の比較と変換

例データ:

user01: [[01.Jun, 54],[02.Jun, 32], [05.Jun, 14], [07.Jun, 87]] 
user02: [[01.Jun, 89],[02.Jun, 4], [03.Jun, 93], [05.Jun, 23], [06.Jun, 57]] 
user03: [[03.Jun, 57],[06.Jun, 11], [07.Jun, 45]] 

がに変換する必要があります:04.Junに、この例では、時々、特定の日には何のクリックイベントがありません

user01: [[01.Jun, 54],[02.Jun, 32], [03.Jun, 0], [05.Jun, 14], [06.Jun, 0], [07.Jun, 87]] 
user02: [[01.Jun, 89],[02.Jun, 4], [03.Jun, 93], [05.Jun, 23], [06.Jun, 57], [07.Jun, 0]] 
user03: [[01.Jun, 0],[02.Jun, 0], [03.Jun, 57], [05.Jun, 0], [06.Jun, 11], [07.Jun, 45]] 

には、ユーザーはそうオンラインではなかったですそのデータは必要ありません。

私の考えは...

1)は、すべてのoccuringユニークx値[01.Jun、02.Jun、03.Jun、05.Jun、06.Junの配列を生成することになり、 07.Jun]

2)その日

3のエントリが存在する場合、データがライブであるので0

のエントリを作成しない場合よりも)すべてのユーザーの配列をチェックします更新され、ユーザーの数は可変です:それを行うための効率的な方法がありますか?あなたの助けのための

ありがとう!

マフ

EDIT:日数はここ

+1

は、[ゼロ値のための*パディング*](httpsの章を見てください[* D3ヒントとテクニック*](https://leanpub.com/D3-Tips-value-sub-value)を参照してください(leanpub.com/D3-Tips-and-Tricks/read#leanpub-auto-padding-for-zero-values)アンド・トリック/リード)この章は、SOに関する次の質問に触発されました。[* "d3.js/JavaScriptの時系列にゼロ値を追加する方法" *](/ q/23227991) – altocumulus

+0

これは解決策です、ありがとう! – Raggamuffin

答えて

1

これが最も効率的なソリューションではありませんが、私はそれ慣用RAMDAコードを検討://:

// data Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun 
// 
// Day satisfies Ord, the class of orderable types. 
const Mon = 1; 
const Tue = 2; 
const Wed = 3; 
const Thu = 4; 
const Fri = 5; 
const Sat = 6; 
const Sun = 7; 

// days :: Array Day 
const days = [Mon, Tue, Wed, Thu, Fri, Sat, Sun]; 

// defaultPairs :: Pair Day Integer 
const defaultPairs = R.map(day => [day, 0], days); 

// fillGaps :: Array (Pair Day Integer) -> Array (Pair Day Integer) 
const fillGaps = pairs => { 
    const toInsert = R.differenceWith(R.eqBy(R.head), defaultPairs, pairs); 
    return R.sortBy(R.head, R.concat(pairs, toInsert)); 
}; 

fillGaps([[Mon, 54], [Tue, 32], [Fri, 14], [Sun, 87]]); 
// => [[1, 54], [2, 32], [3, 0], [4, 0], [5, 14], [6, 0], [7, 87]] 
1

日付オブジェクトですが、ループを使用してソリューションです。それは正常に動作しています。私は木曜日にThuを追加しました。しかし、あなたがそれを必要としないなら、それをdays配列から削除してください。

var user01 = [ 
    ['Mon', 54], 
    ['Tue', 32], 
    ['Fri', 14], 
    ['Sun', 87] 
]; 

var days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; 

function fillGap(input) { 
    var data = []; 
    var index = 0; 
    days.forEach(function(day) { 
    if (input[index][0] == day) { 
     data.push(input[index]); 
     index++; 
    } else { 
     data.push([day, 0]); 
    } 
    }); 
    return data; 
} 

console.log(fillGap(user01)); 

出力:

[[ "月"、54]、[ "火"、32]、[ "水"、0]、[ "木"、0]、 [ "金"、14]、[ "土"、0]、[ "日"、87]]

私はjsbinを作成し、あなたが試すことができます。

http://jsbin.com/hunudul/edit?html,js,console,output

+0

ありがとう!私はもっ​​と明確にすべきだった:今週の例のために選んだ、実際にはDateオブジェクトで、平日のようにあらかじめ定義されていないWeekday abreviation。私は質問を編集しました。 – Raggamuffin

+0

@Raggamuffin間違った質問を投稿して他の時間を無駄にしないで、一週間以上更新を続けてください。 –

+0

@Raggamuffin '01.Jun'は文字列でも変数名でもないので、なぜ実際の値を見てポストしますか? –