【问题标题】:how to use lodash groupBy, sumBy and orderBy and keep structure of array如何使用 lodash groupBy、sumBy 和 orderBy 并保持数组的结构
【发布时间】:2017-08-11 04:15:49
【问题描述】:

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

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

【问题讨论】:

  • 您应该将输入格式化为代码,以便更容易查看代码或数据的样子。
  • 对不起...在这里
  • 如果您将数据缩进 4 个空格并在每条记录后换行会更好。但是对于你的问题:我不明白你的问题是什么。为什么不遍历这些数据并对要排序和汇总的值进行排序和汇总?
  • 是的,我已经编辑了 qs...let appData1 = (appData) .groupBy(x => x.appName) .map((value, key) =>({ appName: key, Time: _.sumBy(value,'Time'), End: value.End, Position: value.Position, Start: value.startDatetime, })).value();let appData2 =.values (_.orderBy(appData1, ["Time"],['desc']));
  • 以上不起作用,也没有给我需要的结果结构

标签: javascript lodash


【解决方案1】:

我注意到您的第二组样本数据修改了 Totaltime。我不确定这是拼写错误还是故意的,因为您说您不想修改原始数组,但我下面的解决方案假定所有值(包括 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 } ]

【讨论】:

    猜你喜欢
    • 2021-10-28
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多