javascript - 如何使用 lodash groupBy、sumBy 和 orderBy 并保持数组结构

标签 javascript lodash

我有以下对象数组,我想按应用程序名称分组,然后按该应用程序的时间求和,然后排序,这样可以在不更改数组结构的情况下给出最常用的应用程序

[ 
{ 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 并从总时间元素。 请理解以上是虚拟数据。不是实际值。

最佳答案

我注意到您的第二组示例数据修改了总时间。我不确定这是错字还是故意的,因为你说你不想修改原始数组,但我下面的解决方案假设所有值(包括 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 } ]

关于javascript - 如何使用 lodash groupBy、sumBy 和 orderBy 并保持数组结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45626865/

相关文章:

javascript - 使用 Pikaday 设置默认时间

javascript - 变量未传递给 Ajax 调用 : undefined variable

javascript - 将整数数组映射到对象数组

javascript:默认情况下始终将函数中的第 n 个参数作为固定值传递

javascript - 如果一个对象的键值是一个数组,它会生成一个新的对象

JavaScript/lodash 数据转换

javascript - 在 Honeywell 75e 和 Phonegap 上捕获条码读取器事件

javascript - 将 javascript 表导出到 Excel 或控制台表

javascript - 如何在常规 Chrome 扩展中调用 chrome.devtools.* api 调用,而无需在浏览器中打开 devtools

javascript - 使用 javascript/nodejs 分割 url 并存储在数组、对象或字符串中