2017-10-18 17 views
0

私は時間ベースで結合されたオブジェクトの配列を持っています。たとえば:
タイムスタンプアトリビュートから時系列に基づくオブジェクトの配列の分離

[{"id": "12345", "data": "abc", "timestamp": "2017-10-17T00:05:30.523Z"}, 
{"id": "16375", "data": "sgr", "timestamp": "2017-10-17T00:23:54.234Z"}, 
{"id": "46537", "data": "etd", "timestamp": "2017-10-17T01:36:16.463Z"}, 
{"id": "83645", "data": "eth", "timestamp": "2017-10-17T01:32:25.640Z"}, 
{"id": "36153", "data": "her", "timestamp": "2017-10-17T01:56:13.478Z"}, 
{"id": "31383", "data": "sry", "timestamp": "2017-10-17T05:56:56.362Z"}, 
{"id": "68123", "data": "rya", "timestamp": "2017-10-17T06:34:30.652Z"}] 

私がしたい、次の形式で結果データ:

{ "00:00-00:59": 
[{"id": "12345", "data": "abc", "timestamp": "2017-10-17T00:05:30.523Z"}, 
{"id": "16375", "data": "sgr", "timestamp": "2017-10-17T00:23:54.234Z"}] 
"01:00-01:59": 
[{"id": "46537", "data": "etd", "timestamp": "2017-10-17T01:36:16.463Z"}, 
{"id": "83645", "data": "eth", "timestamp": "2017-10-17T01:32:25.640Z"}, 
{"id": "36153", "data": "her", "timestamp": "2017-10-17T01:56:13.478Z"}] 
"05:00-05:59": [{"id": "31383", "data": "sry", "timestamp": "2017-10-17T05:56:56.362Z"}] 
"06:00-06:59": [{"id": "68123", "data": "rya", "timestamp": "2017-10-17T06:34:30.652Z"}] 

それは前述したようにデータをフォーマットすることは可能ですか?どのようにして要件の短いコードを書くことができますか?

答えて

2

は、あなたが望ましいオブジェクトにあなたの配列を変換するためにArray.reduceメソッドを使用することができます

var a = [{"id": "12345", "data": "abc", "timestamp": "2017-10- 17T00:05:30.523Z"}, 
{"id": "16375", "data": "sgr", "timestamp": "2017-10-17T00:23:54.234Z"}, 
{"id": "46537", "data": "etd", "timestamp": "2017-10-17T01:36:16.463Z"}, 
{"id": "83645", "data": "eth", "timestamp": "2017-10-17T01:32:25.640Z"}, 
{"id": "36153", "data": "her", "timestamp": "2017-10-17T01:56:13.478Z"}, 
{"id": "31383", "data": "sry", "timestamp": "2017-10-17T05:56:56.362Z"}, 
{"id": "68123", "data": "rya", "timestamp": "2017-10-17T06:34:30.652Z"}] 

var t, h, n, obj = {}; 
for(var i=0; i<a.length; i++) { 
    t = new Date(a[i].timestamp); 

    if (!isNaN(t.getTime())) { //if date is valid 
     h = t.getHours(); 
     n = h + ':00-' + h + ':59'; 
     if(typeof obj[n] === 'undefined') obj[n] = []; 
     obj[n].push(a[i]); 
    } 
} 

console.log(obj); 
+0

't 'が有効な日付であるかどうかを確認するために、日付コンストラクタの後にチェックを入れてください。 – gurvinder372

+0

@ Firemen26ありがとうございました。ちょうどうまくいった – Chetanraj

+0

うわー。これは素晴らしいです! – levi

0

このコードを試してみてください。

次の例を参照してください。 Fireman26さんへ

var a = [{"id": "12345", "data": "abc", "timestamp": "2017-10- 17T00:05:30.523Z"}, 
 
{"id": "16375", "data": "sgr", "timestamp": "2017-10-17T00:23:54.234Z"}, 
 
{"id": "46537", "data": "etd", "timestamp": "2017-10-17T01:36:16.463Z"}, 
 
{"id": "83645", "data": "eth", "timestamp": "2017-10-17T01:32:25.640Z"}, 
 
{"id": "36153", "data": "her", "timestamp": "2017-10-17T01:56:13.478Z"}, 
 
{"id": "31383", "data": "sry", "timestamp": "2017-10-17T05:56:56.362Z"}, 
 
{"id": "68123", "data": "rya", "timestamp": "2017-10-17T06:34:30.652Z"}] 
 

 
var obj = a.reduce((acc, curr) => { 
 
    var t = new Date(curr.timestamp); 
 
    if(!isNaN(t.getTime())) { 
 
    var h = t.getHours(); 
 
    var index = h + ':00-' + h + ':59'; 
 
    if(!acc[index]) { 
 
     acc[index] = []; 
 
    } 
 
    acc[index].push(curr); 
 
    } 
 
    return acc; 
 
}, {}); 
 

 

 
console.log(obj);

0

マイナーな修正のカップル答え:

const data = [ 
    {"id": "12345", "data": "abc", "timestamp": "2017-10-17T00:05:30.523Z"}, 
    {"id": "16375", "data": "sgr", "timestamp": "2017-10-17T00:23:54.234Z"}, 
    {"id": "46537", "data": "etd", "timestamp": "2017-10-17T01:36:16.463Z"}, 
    {"id": "83645", "data": "eth", "timestamp": "2017-10-17T01:32:25.640Z"}, 
    {"id": "36153", "data": "her", "timestamp": "2017-10-17T01:56:13.478Z"}, 
    {"id": "31383", "data": "sry", "timestamp": "2017-10-17T05:56:56.362Z"}, 
    {"id": "68123", "data": "rya", "timestamp": "2017-10-17T06:34:30.652Z"} 
] 

const grouped = data.reduce((obj, item) => { 
    const hourString = String(new Date(item.timestamp).getUTCHours()).padStart(2, '0') 
    if (hourString !== "NaN") { 
     const key = `${hourString}:00-${hourString}:59`; 
     (obj[key] = obj[key] || []).push(item) 
    } 
    return obj; 
}, {}); 
  1. 時間はUTCタイムゾーンのために取られています。
  2. 時間に「0」、すなわちの代わりに01:00-01:59が埋め込まれています。
関連する問題