2017-05-27 7 views
0

これは以前に尋ねられた質問(In javascript, how do I extract the month from date string "yyyy-mm-dd" or timeStamp?)の修正版で、@mhodgesによってうまく解決されました。javascriptでは、jsonデータから入れ子になった配列やオブジェクトを作成するにはどうすればよいですか?

変更の性質上、私は新しい質問を作成することが適切であると考えました。

私は、jsonオブジェクトとして特定のログされたイベントを持つデータベースを持っています。それぞれのイベントはJSミリ秒のタイムスタンプを持ち、「yyyy-mm-dd」という形式の日付文字列と分エントリもあります。

与えられた月と年に入力されたログの数をカウントするアルゴリズムへの入力としてタイムスタンプを使用したいと思います。

また、指定された月と曜日に記録された累積分数を合計するアルゴリズムも欲しいと思います。この例では

例えば、

log1: { 
    Date:"2017-05-24", 
    TimeStamp:1495612800, 
    Minutes: 15}, 
log2: { 
    Date:"2017-05-19", 
    TimeStamp:1495180800, 
    Minutes: 45}, 
log3: { 
    Date:"2017-04-24", 
    TimeStamp:1493020800, 
    Minutes:30}, 
log4: { 
    Date:"2016-08-15", 
    TimeStamp:1471248000, 
    Minutes:75} 

、アルゴリズムは、2017年5月の月中に2つのログ、1つのログは2017年4月の月であることをカウントし、8月中のログです2016年

アルゴリズムはまた、2017年4月の月中に30分、8月2016で75分

、2017年5月の月にそのソリューションを修正して任意のヘルプを60分の合計を返します@以前に提供されていたモーゲージ((In javascript, how do I extract the month from date string "yyyy-mm-dd" or timeStamp?))を適切なネストされた出力に追加すると、非常に感謝しています!

私は悩み、それを達成するために@mhodgesソリューションを修正したが、このようなものを想定しています:

{ 
    "2016":{ 
    "8": { 
     occurrences: 1, 
     minutes: 75 
    } 
    }, 
    "2017":{ 
    "4": { 
     occurrences: 1, 
     minutes: 30 
    }, 
    "5": { 
     occurrences: 2, 
     minutes: 60 
    } 
    } 
} 

おかげ

答えて

1

、おそらく代わりに、タイムスタンプの日付値を使用します。ログをループして、毎月の分を追加することができます。

それはこのようなものになります。あなたのソリューションのための

var logs = [{ 
 
    Date: "2017-05-24", 
 
    TimeStamp: 1495612800, 
 
    Minutes: 15 
 
    }, 
 
    { 
 
    Date: "2017-05-19", 
 
    TimeStamp: 1495180800, 
 
    Minutes: 45 
 
    }, 
 
    { 
 
    Date: "2017-04-24", 
 
    TimeStamp: 1493020800, 
 
    Minutes: 30 
 
    }, 
 
    { 
 
    Date:"2016-08-15", 
 
    TimeStamp:1471248000, 
 
    Minutes:75 
 
    } 
 
]; 
 

 
var result = {}; 
 
for (var i = 0; i < logs.length; i++) { 
 
    var year = logs[i].Date.slice(0, 4); 
 
    var month = logs[i].Date.slice(5, 7); 
 
    if (!result[year]) { 
 
    result[year] = {}; 
 
    } 
 
    if (!result[year][month]) { 
 
    result[year][month] = { 
 
     occurences: 1, 
 
     minutes: logs[i].Minutes 
 
    } 
 
    continue; 
 
    } 
 
    result[year][month].occurences++; 
 
    result[year][month].minutes += logs[i].Minutes; 
 
} 
 

 
console.log(result);

+0

あなたの解決策に感謝します。私が達成しようとしていた目標を達成した私の与えられたセットアップで私が実装する最も簡単な解決策であるように思えたので、私はそれを選んだ。しかし、私はtimeStampを使い続けてちょっと修正しました。 – esd100

0

ここでの亀裂があります。

let i = arr.length; 
let obj = {}; 
while(i--){ 
    let [year, month, day] = arr[i].Date.split('-'); 

    //probably a better way of initializing a hashtree. 
    if(!obj[year]){ obj[year] = {}; } 
    if(!obj[year][month]){ obj[year][month] = {}} 

    let occur = obj[year][month]['occurences'] 
    let minutes = obj[year][month]['minutes'] 

    obj[year][month]['occurences'] = (occur === undefined) ? 1 : occur + 1; 
    obj[year][month]['minutes'] = (minutes === undefined) ? arr[i].Minutes : arr[i].Minutes + minutes; 
} 

https://jsfiddle.net/25n4jo4e/

+0

感謝を。それは間違いなくエレガントで、私はあまり変更する必要がないので、私はそれを使用するために私のコードを変更する可能性があります。私はスタックのオーバーフローが実際にどのように機能するのかは分かりませんが、それが役立つならば、あなたに親指やチェックマークを付けるのはうれしいです。 – esd100

1

Array.prototype.mapArray.prototype.reduceだけでなく、日付の方法で構築されたのいくつか解決するための良い問題のように思えます。あなたの予想出力から判断すると

const logs = [ 
 
    { 
 
    Date:"2017-05-24", 
 
    TimeStamp:1495612800, 
 
    Minutes: 15 
 
    }, 
 
    { 
 
    Date:"2017-05-19", 
 
    TimeStamp:1495180800, 
 
    Minutes: 45 
 
    }, 
 
    { 
 
    Date:"2017-04-24", 
 
    TimeStamp:1493020800, 
 
    Minutes:30 
 
    }, 
 
    { 
 
    Date:"2016-08-15", 
 
    TimeStamp:1471248000, 
 
    Minutes:75 
 
    }] 
 

 
// mapping over the logs, transforming each so that we have data in the right form (ie. years, months, and minutes; occurences we'll get later). 
 
const flat = logs.map(log => { 
 
    const date = new Date(log.Date) 
 
    return { 
 
    year: date.getFullYear(), 
 
    month: date.getMonth() + 1, 
 
    minutes: log.Minutes, 
 
    } 
 
}) 
 

 
const hierarchy = flat.reduce((hier, log) => { 
 
    // As we're building the result, we need to init things if they don't already exist 
 
    hier[log.year] = hier[log.year] || {} 
 
    // The lowest level will have this form 
 
    hier[log.year][log.month] = hier[log.year][log.month] || 
 
    { 
 
     occurences: 0, 
 
     minutes: 0 
 
    } 
 
    
 
    // Accumulate minutes and occurences as we go 
 
    hier[log.year][log.month].minutes += log.minutes 
 
    hier[log.year][log.month].occurences += 1 
 

 
    return hier 
 
}, {}) 
 

 
console.log(hierarchy)

+0

あなたのソリューションをありがとう。私はそれが間違いなく働いたと思う。私はスタックのオーバーフローが実際にどのように機能するのかは分かりませんが、それが役立つならば、あなたに親指やチェックマークを付けるのはうれしいです。 – esd100

関連する問題