2017-06-13 8 views
1

私は一日の始まりに0時から始まる5分の間隔で一意のユーザーの数を得るように配列をソートしようとしています。 エポックタイムで5分間隔を定義するにはどうすればよいですか? (使用されるデータは当日のエポックタイムとなります)、そのインターバルの一意のユーザー数はどのように取得できますか?ユニークな値を持つ5分間隔で配列を並べ替える

入力

[1486428994000, "user a"]  

[1486429834000, "user a"] 

[1486429839000, "user a"] 

[1486429869000, "user b"] 

所望の出力は

[1486428900000, 1 ] 

[1486429800000, 2 ] 
+0

5分は '5 * 60 * 1000 'です... – deceze

答えて

0

繰り返しタイマーを設定するには、

var T = setInterval(function(){ 
/* code here */ 
}, 1e3*60*5); 

1E3 = 1000(ミリ秒)を使用することができます ×60(秒)
×5(分)

"今" JavaScriptで使用できるため:

new Date().valueOf()

あなたが持っているかもしれません使用しているエポックのタイプに応じてあなたが使用することができ、分割または一意の値を取得するには100

によって乗算する.reduce()https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

クライアント側のタイマーを使用するGotchas:

JSタイムスタンプはマシン時間を必要とするので、クライアントのマシンの日付/時刻がオフの場合は計算が間違っています。これを防ぐにはサーバーのタイムスタンプをフロントエンドとjavascriptの日付オブジェクトにキャストし、クライアントのマシン時間ではなく、その作業。

述べたように、サーバー側またはクライアント側のいずれかを調整する必要がある場合がありますので、エポックタイムスタンプは、サーバソフトウェアにサーバーソフトウェアによって異なります(100倍の通常の差)

1

// Remove doublons from an array. 
 
const uniq = array => 
 
    array.filter((value, index) => array.indexOf(value) === index); 
 

 
// Your function. 
 
const groupCount = (data, timeWindow) => 
 
    data 
 
    .reduce((groups, line) => { 
 
     const current = groups[groups.length - 1]; 
 
     // If the line is outside of the current time window, push a new group. 
 
     if (!current || line[0] > current[0] + timeWindow) { 
 
     // Find the beginning of the corresponding time window. 
 
     const windowStart = line[0] - line[0] % timeWindow; 
 
     // Push the new group. 
 
     groups.push([windowStart, [line[1]]]); 
 
     } else { 
 
     // Else add a new user to the group. 
 
     current[1].push(line[1]); 
 
     } 
 
     return groups; 
 
    }, []) 
 
    // Once we created the groups, we remove doublons from them and count users. 
 
    .map(group => [group[0], uniq(group[1]).length]); 
 

 
const data = [ 
 
    [1486428994000, "user a"], 
 
    [1486429834000, "user a"], 
 
    [1486429839000, "user a"], 
 
    [1486429869000, "user b"] 
 
]; 
 
console.log(groupCount(data, 5 * 60 * 1000));

0

一部のタイムスタンプロジックといくつかの配列マジックでは、これをオフにすることができます。以下の解決策は正しい出力を返しますが、最後のマップが完全に必要でないように感じます。誰かが私の解決策を展開するように感じたら、気軽に。 (ミリ秒)エポック時間の

var raw = [ 
 
    [1486428994000, "user a"], 
 
    [1486429834000, "user a"], 
 
    [1486429839000, "user a"], 
 
    [1486429869000, "user b"] 
 
]; 
 
raw.map(a=> a[0] = parseInt(a[0]/(5 * 60 * 1000)) * (5 * 60 * 1000)); 
 
raw = raw.reduce(function(a,b) { 
 
    if(!a[b[0]]) a[b[0]] = {users: [], count: 0}; 
 
    if(a[b[0]].users.indexOf(b[1]) === -1) { a[b[0]].users.push(b[1]); a[b[0]].count++; } 
 
    return a; 
 
}, {}); 
 
var ret = []; 
 
for(var i in raw) { 
 
    ret.push([i, raw[i].count]); 
 
} 
 
console.log(ret);

関連する問題