2017-03-12 17 views
2

私は、彼らが作成されるように、キーがDate.now()からである。このミリ秒のデータは、

{ 
    1489330777089: 100, // 12 March 
    1489330824346: 45, // 12 March 
    1489330877089: 90, // 13 March 
    1489330824346: 120, // 13 March 
    ..... 
} 

のようなものを持って、その値は整数です。

これらのデータをグラフにプロットするとします。棒グラフ(日付はx軸)です。

Javascriptを使用してこれらのデータを日付にグループ化し、整数値を合計してどのように集計するのですか。期待される結果がなければ:

{ 
    12 March 2017: 145 // 100 + 45 
    13 March 2017: 210 // 90 + 120 
    ... 
} 

(私はデータを格納するFirebaseを使用し、また、それは注意することが重要だ場合、これは内部に、アプリを反応させるの使用しています。)

ありがとう!

+0

あなたはVAR日=新しい日付(ミリ秒) 'と' Date'を得ることができるように行うことができます; '。 'date.toString()'では、読みやすい日付文字列を取得します。ループに入れて、あなたのやり直してください。 –

+0

@SchokokuchenBäcker申し訳ありませんが、私はそれをより明確にするために質問を更新しました。ミリ秒を現在の日付に変換するだけでなく、同じ日付のものを1つにまとめたいと思っています。整数値の合計も –

+0

タイムゾーン効果のため、これらの時間値は、異なるタイムゾーンで異なる日付を表す場合があることに注意してください。私の場合、4つの時間値はすべて3月13日です。あなたは特定のタイムゾーンでそれらを比較したいですか?これは、[* utc unixtimeの日付文字列を取得し、タイムゾーンオフセット*を追加するのと非常によく似ています*(http://stackoverflow.com/questions/42722400/get-date-string-from-utc-unixtime-and-add-a -timezone-offset)を指定します。 – RobG

答えて

0

グループ化にISO日付を使用できます。たぶんあなたは適切な現地時間にレストランを使う必要があります。

var data = { 1489330777089: 100, 1489330824346: 45, 1489330877089: 90, 1489330824346: 120 }, 
 
    grouped = {}; 
 

 
Object.keys(data).forEach(function (k) { 
 
    var date = (new Date(+k +1000*60*60*24)).toISOString().slice(0, 10); 
 
    grouped[date] = grouped[date] || 0; 
 
    grouped[date] += data[k]; 
 
}); 
 

 
console.log(grouped);

+0

私にとっては、出力は '{" 2017-03-13 ":310}'です。多分タイムゾーンを考慮する必要がありますか?そして値は355でなければならないので、何か他のものもうまくいきません。 – RobG

+0

@RobG、右、オフセットが役立ちます。 –

+0

はい、どれですか? ;-) – RobG

0

これは、値を通過する日にそれらを切り捨て、およびあなたが出力プロパティ文字列/オペレータ/ TRUNCATE単位を変更したい場合がありますグループ化された値

let source = { 
    1489330777089: 100, 
    1489330824346: 45, 
    1489330877089: 90, 
    1489330824346: 120, 
} 

let grouped = Object.keys(source).reduce((output, key) => { 
    let date = new Date(Number(key)), 
     groupedDate = new Date(date.getFullYear(), date.getMonth(), date.getDay()); 

    if (typeof output[groupedDate] === 'undefined') output[groupedDate] = 0; 

    output[groupedDate] += source[key]; 

    return output; 
}, {}); 

の合計で出力します上記のコードを少し変更すれば簡単にできます。

+0

ありがとう!これは素晴らしい。あなたの方法を使用する利点は、ここでニーナScholzによって提供されたものと比較して? –

+0

これは時間帯を考慮していません。これらの時刻の値はすべて同じ日付になっていますので、結果は '{Wed Mar 01 2017 00:00:00 GMT + 1000:310}'です。 – RobG

+0

@RobG今はタイムゾーンを心配しません。さらに、私のサンプルデータは実際にはそれらの日付に対応する実際のミリ秒ではありません。しかし、あなたは正しい。パフォーマンス比較の点でも知りたいのですが: –

0

あなたはこの

var date_obj={ 
 
    1489330777089: 100, // 12 March 
 
    1489330824346: 45, // 12 March 
 
    1489330877089: 90 
 
} 
 
var tempData = {}; 
 
for (var index in date_obj) { 
 
    if (date_obj[index] != "undefined") { 
 
     var milisec= parseInt(index); 
 
     var get_data= new Date(milisec); 
 
var str_date=get_data.toString(); 
 
    var date_str= str_date.substr(0,15); 
 
    if(typeof(tempData[date_str])=== "undefined"){ 
 
    tempData[date_str] = parseInt(date_obj[index]); 
 
    }else{ 
 
     tempData[date_str] = tempData[date_str]+parseInt(date_obj[index]); 
 
    } 
 
    } 
 
} 
 
data = tempData; 
 
console.log(data);