2016-09-03 4 views
2

私は、特定の時間に人が行うコミットの数を数えるデータセットで遊んでいます。私は、人がコミット作られ、彼らが犯した回数を時間配列オブジェクトを作成することができます。私はこだわっているアンダースコアを使用して配列内に不足しているオブジェクトを埋め込む

[ { hour: '6', commits: 2 }, 
    { hour: '7', commits: 6 }, 
    { hour: '8', commits: 6 }, 
    { hour: '9', commits: 4 }, 
    { hour: '10', commits: 4 }, 
    { hour: '11', commits: 6 }, 
    { hour: '12', commits: 18 }, 
    { hour: '13', commits: 18 }, 
    { hour: '14', commits: 14 }, 
    { hour: '15', commits: 30 }, 
    { hour: '16', commits: 24 }, 
    { hour: '17', commits: 18 }, 
    { hour: '18', commits: 24 }, 
    { hour: '19', commits: 22 }, 
    { hour: '20', commits: 6 }, 
    { hour: '21', commits: 16 }, 
    { hour: '22', commits: 8 } ] 

が不足している時間を埋めるためにしようとしています。上記の例では、コミットされていない時間を含める必要があります。私は1日中0-24の範囲を使用しています。これは私が結果として得ることを望んだものです:

ここ
[ 
    { hour: '0', commits: 0 }, 
    { hour: '1', commits: 0 }, 
    { hour: '2', commits: 0 }, 
    { hour: '3', commits: 0 }, 
    { hour: '4', commits: 0 }, 
    { hour: '5', commits: 0 }, 
    { hour: '6', commits: 2 }, 
    { hour: '7', commits: 6 }, 
    { hour: '8', commits: 6 }, 
    { hour: '9', commits: 4 }, 
    { hour: '10', commits: 4 }, 
    { hour: '11', commits: 6 }, 
    { hour: '12', commits: 18 }, 
    { hour: '13', commits: 18 }, 
    { hour: '14', commits: 14 }, 
    { hour: '15', commits: 30 }, 
    { hour: '16', commits: 24 }, 
    { hour: '17', commits: 18 }, 
    { hour: '18', commits: 24 }, 
    { hour: '19', commits: 22 }, 
    { hour: '20', commits: 6 }, 
    { hour: '21', commits: 16 }, 
    { hour: '22', commits: 8 }, 
    { hour: '23', commits: 0 }, 
    { hour: '24', commits: 0 } 
] 

私は、これらのオブジェクトを作成するために使用している機能は次のとおりです。

var getAuthorAndHourCounts = (groupedByAuthor) => { 

    var result = _.map(groupByAuthor, (value, key, list) => { 

    var author = key; 
    var hours = _.countBy(value, 'hour'); 

    var commitHourList = []; 

    _.each(hours, (v,k) => { 
     var obj = {}; 
     obj.hour = k; 
     obj.commits = v; 
     commitHourList.push(obj); 
    }); 

    return { 
     person: author, 
     times: commitHourList 
    }; 

    }); 
    return result; 
}; 

どのように私は行方不明の時間を追加することができますか?私はリスト(0-24)を作成し、オブジェクトにゼロの値を追加するために時間がリストにないかどうかを見ていました。それがどのように達成されるかわからない。ちょうどそれが実際のデータでそれを埋める、その後0コミットして、すべての時間が含まれていて、そのcommitHourListなどの初期化に関する

+2

をコピーする最もパフォーマンスの方法です:あなたあなたのリストには24時間ではなく25時間があることを認識しています。「時間:0」と「時:24」の違いは何ですか? – Wh1T3h4Ck5

+0

これをキャッチしていただきありがとうございます。私は24時間使用するつもりです。 0は真夜中、1は午前1時などとなります。 – AldoTheApache

答えて

3

方法:

// initialize commitHourList with 24 objects 
// one for each hour and each with 0 commits 
var commitHourList = _.range(24).map((hour) => ({ hour, commits: 0 })); 

// for every received hour, add proper commits 
_.each(hours, (commits, hour) => { 
    commitHourList[hour].commits = commits; 
}); 

この方法で、あなたは追加しないものは何でも時間が自動的に0コミットをしています。

:アレイを初期化するためにmap次いでrangeを使用して以下のコードであるが、二回毎にアレイを反復ありません。より効率的な方法は、この配列をユーティリティで一度作成し、新しい配列が必要になるたびにコピーすることです。例えば

:その後、

// utility that creates the hours array when initialized 
// and returns a function that will return a copy of the hours array on each call 
var getHoursArray = (function() { 
    var arr = _.range(24).map((hour) => ({ hour, commits: 0 })); 
    return function() { 
    return arr.slice(); 
    } 
})(); 

など、それを使用します。sliceを使用して

var commitHourList = getHoursArray(); 

は、通常はサイドノート配列が、here are other possibilities

+1

は論理的に見えますが、欠落しているデータのチェックと再入力は避けてください – Wh1T3h4Ck5

+1

ありがとうございました。関数を使って配列を作成して再利用することをお勧めします。これは私の問題を解決し、何か新しいことを学ぶのを助けました! – AldoTheApache

+0

喜んで:) – nem035

関連する問題