2017-01-27 8 views
0

今私はかなり失われています。これは約6日間今作業していますので、少し混乱させてください。私はBigQueryから来るデータに基づいていくつかのグラフを表示するためにNVD3を使用しています。入って来るすべてのデータは正しいので、グラフの実装は、実際のJSONデータです。マルチバーチャートでは、データの各「セット」は、初期配列の下で同じ日付と同じ数の値を持つ必要があります。私のデータに基づいて、ユーザーがイベントやその日何かを記録しなかった場合に、値が欠落することがあります。jsonオブジェクトのデフォルト値は、同じ配列内の他のオブジェクトの内容に基づいています。

私がここでやろうとしていることの一般的な考え方は、最初のjsonをループし、「欠落」値を追加することです。たとえば、これは私がBigQueryのと私のAPIから抜け出す初期データのようになります。

[ 
    "t1":{ 
    "target": "t1", 
    "datapoints": [ 
     [ 
     16.0, 
     1483747200.0 
     ], 
     [ 
     10.0, 
     1484352000.0 
     ] 
    ] 
    }, 
    "t2":{ 
    "target": "t2", 
    "datapoints": [ 
     [ 
     10.0, 
     1483660800.0 
     ], 
     [ 
     19.0, 
     1484006400.0 
     ], 
     [ 
     10.0, 
     1484956800.0 
     ] 
    ] 
    } 
] 

あなたが第一の目的は、2つの値を持つデータポイントの配列を持っている、オブジェクト2は3つの値を持つデータポイントの配列を持っていることをここで見ることができます。 datapoints配列の1つのインデックスにはUNIXの日付が含まれています。オブジェクト全体のすべてのデータポイント配列には、日付を持つ配列が必要です。デフォルト値は0です。だから、フォーマットされたデータは、このようなものになります。

[ 
    "t1":{ 
    "target": "t1", 
    "datapoints": [ 
     [ 
     16.0, 
     1483747200.0 
     ], 
     [ 
     10.0, 
     1484352000.0 
     ], 
     [ 
     0.0, 
     1483660800.0 
     ], 
     [ 
     0.0, 
     1484006400.0 
     ], 
     [ 
     0.0, 
     1484956800.0 
     ] 
    ] 
    }, 
    "t2":{ 
    "target": "t2", 
    "datapoints": [ 
     [ 
     10.0, 
     1483660800.0 
     ], 
     [ 
     19.0, 
     1484006400.0 
     ], 
     [ 
     10.0, 
     1484956800.0 
     ], 
     [ 
     0.0, 
     1483747200.0 
     ], 
     [ 
     0.0, 
     1484352000.0 
     ] 
    ] 
    } 
] 

を私は本当にここからどこへ行くと、いかなるヘルプは非常に参考になる見当がつかない。私はこれを数日間続けてきましたが、この時点で歯車を削っています。おかげ

は基本的には、1列で見つかっていますが、他にタイムスタンプを取るべきであるが、0

に最初の値/インデックスを設定していないそれぞれの値は、私はまた、クエリはバックのみ30日間照会していることを言及する必要がありますしたがって、多くの場合、各データポイント配列は30個の配列を持ちます。

+0

あなたは、基本的なJavaScriptのループとDateオブジェクトに精通している場合、これは簡単です。 MDNやチュートリアルでこれらを調べてみましたか? – metame

+0

私はあらゆるところを見てきましたが、実際のコードの問題よりも論理的なものです。私はこのタイプの仕事をするためにjavascriptを使うのが最善ではない。私は各配列をループする必要があることを知っていますが、値をどうするかについてはわかりません。通常、私は数日間このことをやり直して、それを解決するために戻ってきますが、私は本当にその選択肢...締め切りを持っていません。 –

+0

時間制約は、ms(正確)かまったく毎日ですか? – metame

答えて

2

あなたは、日付のすべてを取得する最初の処理データのビットを行う必要があります、それはの問題です各日付の実際のデータを入力します。

const json = [ 
 
    { 
 
    "target": "t1", 
 
    "datapoints": [ 
 
     [ 
 
     16.0, 
 
     1483747200.0 
 
     ], 
 
     [ 
 
     10.0, 
 
     1484352000.0 
 
     ] 
 
    ] 
 
    }, 
 
    { 
 
    "target": "t2", 
 
    "datapoints": [ 
 
     [ 
 
     10.0, 
 
     1483660800.0 
 
     ], 
 
     [ 
 
     19.0, 
 
     1484006400.0 
 
     ], 
 
     [ 
 
     10.0, 
 
     1484956800.0 
 
     ] 
 
    ] 
 
    } 
 
] 
 

 
// using es6 set 
 
const dates = new Set() 
 

 
json.forEach(x => x.datapoints.map(dp => dates.add(dp[1]))) 
 

 
// all dates are there 
 
dates.forEach(d => console.log(d)) 
 

 
const fillDp = dp => { 
 
    return Array.from(dates).sort().map(d => dp.find(x => x[1] === d) || [0,d]) 
 
} 
 

 
const result = json.map(x => Object.assign(x, {datapoints: fillDp(x.datapoints)})) 
 
    
 
console.log(JSON.stringify(result[0].datapoints))

+0

あなたは絶対的な命の恩人です。私の最初の「テスト」から、これは私がしたいことを正確にやっているようです。私はそれが正しいと確信したら、答えを受け入れるでしょう。再度、感謝します!! –

+0

新しい日付に注文を追加するのはどうですか?私は、早くから、早いか遅いか早いかのいずれかで、それらを注文することができる必要があります。 –

+0

配列に設定された日付を変換し、そこから並べ替えを行うことができます。 – metame

0

以下は、すばやく汚れた解決策です。入力したサンプルに追加のエントリを追加して、両方のデータオブジェクトに共通の日付のデータポイントが含まれるようにします。

var orig= [ 
    { 
    "target": "t1", 
    "datapoints": [ 
     [ 
     16.0, 
     1483747200.0 
     ], 
     [ 
     10.0, 
     1484352000.0 
     ], 
     [ 
     10.0, 
     1483660800.0 
     ] 
    ] 
    }, 
    { 
    "target": "t2", 
    "datapoints": [ 
     [ 
     10.0, 
     1483660800.0 
     ], 
     [ 
     19.0, 
     1484006400.0 
     ], 
     [ 
     10.0, 
     1484956800.0 
     ] 
    ] 
    } 
]; 
console.log('Original Data', JSON.stringify(orig)); 

// Get a list of all the datapoint dates 
var dates = []; 
orig.forEach(function(item) { 
    item.datapoints.forEach(function(dp) { 
    var date = dp[1]; 
    dates.push(date); 
    }) 
}); 
console.log('All Dates', JSON.stringify(dates)); 

// Remove duplicates from array 
dates = dates.filter(function (el, i, arr) { 
    return arr.indexOf(el) === i; 
}); 
console.log('Unique Dates', JSON.stringify(dates)); 

// Check each item in the original array for records for each date and add a 
// 0 value entry if the date entry is missing 
dates.forEach(function(dt) { 
    orig.forEach(function(item, itemIndex) { 
    var hasEntry = false; 

    item.datapoints.forEach(function(dp) { 
     if (dp[1] === dt) hasEntry = true; 
    }); 

    if (!hasEntry) { 
     item.datapoints.push([0, dt]); 
    } 
    }); 
}); 

console.log('Updated Data', JSON.stringify(orig)); 

そして、ここであなたがアクションでそれを見ることができるように対応するplunkerです:https://plnkr.co/edit/K1NK2Xx8RNrqyp7yZ3n2?p=preview

+0

このコードでは、新しい配列/オブジェクトにプッシュされていますか?これがうまくいくかもしれないようです。 –

+0

'if(!hasEntry)'ステートメントでは、その日付で一致するエントリが見つからなかったことを意味し、エントリを 'updated'配列にプッシュします。 – GPicazo

+0

私はそれをorgin配列にプッシュできる方法はありますか?それは私が本当に必要とするものであり、新しい配列ではありません。 –

関連する問題