2017-08-11 3 views
2

私は次のオブジェクトの配列を持っていますが、アプリケーション名でグループ化し、そのアプリケーションの時間で合計してから、配列lodash groupBy、sumBy、orderByの使い方と配列の構造を維持する

[ 
{ appName: GoogleChrome, Position: GoogleChrome, start: "2017/04/07 05:31:51" end:"2017/04/07 05:31:51", Totaltime:1}, 
{ appName: GoogleChrome, Position: GoogleChrome, start: "2017/04/07 05:31:51" end:"2017/04/07 05:31:51",Totaltime:1}, 
{ appName: GoogleChrome, Position: GoogleChrome, start: "2017/04/07 05:31:51" end:"2017/04/07 05:31:51", Totaltime:1}, 
{ appName: Code, Position: Code, start: "2017/04/07 05:31:51" end:"2017/04/07 05:31:51",Totaltime:1}, 
{ appName: Code, Position: Code, start: "2017/04/07 05:00:51" end:"2017/04/07 05:15:51",Totaltime:15}, 
{ appName: Slack, Position: Slack, start: "2017/04/07 05:10:51" end:"2017/04/07 05:20:51",Totaltime:10}, 
{ appName: Slack, Position: Slack, start: "2017/04/07 05:30:00" end:"2017/04/07 05:50:51",Totaltime:20}, 
{ appName: Slack, Position: Slack, start: "2017/04/07 05:31:51" end:"2017/04/07 05:31:51",Totaltime:1}, 
{ appName: Slack, Position: Slack, start: "2017/04/07 05:31:51" end:"2017/04/07 05:31:51",Totaltime:1} ] 

の構造を変更することなく、トップ最も使用されるアプリと私は_droprightを行い、合計時間要素からだろう結果を得れば、私は次のような結果

[ 
{ appName: Slack, Position: Slack, start: "2017/04/07 05:31:51" end:"2017/04/07 05:31:51",Totaltime:32}, 
{ appName: Slack, Position: Slack, start: "2017/04/07 05:30:00" end:"2017/04/07 05:50:51",Totaltime:32}, 
{ appName: Slack, Position: Slack, start: "2017/04/07 05:31:51" end:"2017/04/07 05:31:51",Totaltime:32}, 
{ appName: Slack, Position: Slack, start: "2017/04/07 05:31:51" end:"2017/04/07 05:31:51",Totaltime:32}, 
{ appName: Code, Position: Code, start: "2017/04/07 05:31:51" end:"2017/04/07 05:31:51",Totaltime:16}, 
{ appName: Code, Position: Code, start: "2017/04/07 05:31:51" end:"2017/04/07 05:31:51",Totaltime:16}, 
{ appName: GoogleChrome, Position: GoogleChrome, start: "2017/04/07 05:31:51" end:"2017/04/07 05:31:51", Totaltime:3}, 
{ appName: GoogleChrome, Position: GoogleChrome, start: "2017/04/07 05:31:51" end:"2017/04/07 05:31:51",Totaltime:3}, 
{ appName: GoogleChrome, Position: GoogleChrome, start: "2017/04/07 05:31:51" end:"2017/04/07 05:31:51", Totaltime:3} ] 

をしたいです。 上記はダミーデータであることをご了承ください。実際の値ではありません。

+0

あなたはそれがコードやデータがどのように見えるかを確認する方が簡単ですので、コードとして入力をフォーマットする必要があります。 – Guenther

+0

申し訳ありませんが...ここでは – Suv

+0

4つのスペースでデータをインデントし、各レコードの後に​​行をラップすると、より良い結果が得られます。しかしあなたの質問に:私はあなたの問題が何かを見ていない。なぜあなたはそのデータをループしてソートし、合計したい値をソートして合計しないのですか? – Guenther

答えて

1

サンプルデータの2番目のセットにTotaltimeが変更されていることがわかりました。あなたが元の配列を変更したくないと言ったので、これがタイプミスか意図的なものかどうかはわかりませんが、私のソリューションでは、TotalTimeを含むすべての値が、開始時と全く同じであると仮定しています。また、ダミーデータはそのまま動作させるために若干の変更が必要でしたので、小さな変更(コンマ、文字列など)を追加して実行しました。

最後に、エントリを実際に並べ替えたことを示すために、元のリスト内の項目を(値を変更せずに)移動しました。

以下のコードは、リストを受け取り:

  • グループのappName
  • により、
  • 最長時間の降順に所与のappName有する複数のエントリが、それらの合計時間によってグループ化appNameのエントリをソートソート降順に
  • は、あなたの場合、単一のアレイ

に一緒にすべてをフラットにappName内でソートされた個々のエントリも必要としないようにするには、.map()コールを削除するだけです。

const data = [ 
 
{ appName: 'GoogleChrome', Position: 'GoogleChrome', start: "2017/04/07 05:31:51", end:"2017/04/07 05:31:51", Totaltime:1}, 
 
{ appName: 'Slack', Position: 'Slack', start: "2017/04/07 05:31:51", end:"2017/04/07 05:31:51",Totaltime:1}, 
 
{ appName: 'GoogleChrome', Position: 'GoogleChrome', start: "2017/04/07 05:31:51", end:"2017/04/07 05:31:51", Totaltime:1}, 
 
{ appName: 'Code', Position: 'Code', start: "2017/04/07 05:31:51", end:"2017/04/07 05:31:51",Totaltime:1}, 
 
{ appName: 'Slack', Position: 'Slack', start: "2017/04/07 05:30:00", end:"2017/04/07 05:50:51",Totaltime:20}, 
 
{ appName: 'Code', Position: 'Code', start: "2017/04/07 05:00:51", end:"2017/04/07 05:15:51",Totaltime:15}, 
 
{ appName: 'GoogleChrome', Position: 'GoogleChrome', start: "2017/04/07 05:31:51", end:"2017/04/07 05:31:51",Totaltime:1}, 
 
{ appName: 'Slack', Position: 'Slack', start: "2017/04/07 05:10:51", end:"2017/04/07 05:20:51",Totaltime:10}, 
 
{ appName: 'Slack', Position: 'Slack', start: "2017/04/07 05:31:51", end:"2017/04/07 05:31:51",Totaltime:1} ]; 
 

 
function reorder(list) { 
 
    const newList = _(list) 
 
     .groupBy('appName') 
 
     .map(element => { 
 
      return _.sortBy(element, innerElement => { 
 
       return -innerElement.Totaltime; 
 
      }); 
 
     }) 
 
     .sortBy(element => { 
 
      return -_.sumBy(element, 'Totaltime'); 
 
     }) 
 
     .flatten() 
 
     .valueOf(); 
 

 

 
    console.log(newList); 
 
    return newList; 
 
} 
 

 
reorder(data);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

結果:

[ { appName: 'Slack', Position: 'Slack', start: '2017/04/07 05:30:00', end: '2017/04/07 05:50:51', Totaltime: 20 }, 
{ appName: 'Slack', Position: 'Slack', start: '2017/04/07 05:10:51', end: '2017/04/07 05:20:51', Totaltime: 10 }, 
{ appName: 'Slack', Position: 'Slack', start: '2017/04/07 05:31:51', end: '2017/04/07 05:31:51', Totaltime: 1 }, 
{ appName: 'Slack', Position: 'Slack', start: '2017/04/07 05:31:51', end: '2017/04/07 05:31:51', Totaltime: 1 }, 
{ appName: 'Code', Position: 'Code', start: '2017/04/07 05:00:51', end: '2017/04/07 05:15:51', Totaltime: 15 }, 
{ appName: 'Code', Position: 'Code', start: '2017/04/07 05:31:51', end: '2017/04/07 05:31:51', Totaltime: 1 }, 
{ appName: 'GoogleChrome', Position: 'GoogleChrome', start: '2017/04/07 05:31:51', end: '2017/04/07 05:31:51', Totaltime: 1 }, 
{ appName: 'GoogleChrome', Position: 'GoogleChrome', start: '2017/04/07 05:31:51', end: '2017/04/07 05:31:51', Totaltime: 1 }, 
{ appName: 'GoogleChrome', Position: 'GoogleChrome', start: '2017/04/07 05:31:51', end: '2017/04/07 05:31:51', Totaltime: 1 } ] 
関連する問題