2017-08-11 11 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} ] 

的結構頂部最常用的應用程序,我想下面的結果

[ 
{ 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} ] 

,一旦我得到的結果,我會做一個_dropright,並從總時間元素。 請理解上面是虛擬數據。沒有實際值。

+0

你應該格式化輸入的代碼,所以它更容易看到的代碼或數據的模樣。 – Guenther

+0

對不起,abt,...這裏是 – Suv

+0

如果你用4個空格縮進數據並將每行記錄包裹起來,那會更好。但對於你的問題:我不明白你的問題是什麼。你爲什麼不循環這些數據並對你想要排序和總結的值進行排序和總結? – Guenther

回答

1

我注意到你的第二組樣本數據有Totaltime修改。我不確定這是錯誤的還是故意的,因爲您說過您不想修改原始數組,但我的解決方案假定所有值(包括總時間)都與我們開始時的方式完全相同。此外,虛擬數據需要稍微修改才能實現,因此我添加了一些小的調整(逗號,字符串等)以使其運行。

最後,我移動了原始列表中的項目(不修改任何值),以顯示條目確實已排序。

下面的代碼利用列表:

  • 組由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 } ]