【问题标题】:Underscore sortBy, groupBy with count of grouped arrays下划线 sortBy、groupBy 以及分组数组的计数
【发布时间】:2017-08-17 20:38:37
【问题描述】:

我在使用下划线操作对象数组时遇到了一些麻烦。我快到了,但一直试图在下划线链中组合 countBy 。

我有以下对象数组(简化):

var messages = [
{
    id: 20,
    messageHeaderId: 6,
    content: "Message 1",
    dateOfMessage: "2017-08-16T12:34:49.403974",
    sender: "Diane"
},
{
    id: 22,
    messageHeaderId: 6,
    content: "Latest message from MH6",
    dateOfMessage: "2017-08-16T12:38:49.403974",
    sender: "Diane"
},
{
    id: 13,
    messageHeaderId: 5,
    content: "Message 1 from MH5",
    dateOfMessage: "2017-08-16T10:34:23.848459",
    sender: "Ora"
},
{
    id: 14,
    messageHeaderId: 5,
    content: "Latest message from MH5",
    dateOfMessage: "2017-08-16T12:37:12.237183",
    sender: "Ora"
},

{
    id: 15,
    messageHeaderId: 5,
    content: "Message 2 from MH5",
    dateOfMessage: "2017-08-16T11:00:35.547921",
    sender: "Ora"
},

{
    id: 16,
    messageHeaderId: 5,
    content: "Message 3 from MH5",
    dateOfMessage: "2017-08-16T11:36:51.828447",
    sender: "Ora"
}
];

我的目标是只返回每个线程中由 messageHeaderId 标识的最新消息,以及线程中的消息计数作为新的对象数组。

因此,从上面的数组中,这将产生一个包含 2 个对象的数组,这些对象在 groupBy 方法之后具有每个组中消息数量的计数属性,并作为属性添加到返回的最新消息中。

这是我用来对数组进行排序和分组的方法(我不确定拥有 2 个 map 函数是否是个好主意(?)但这是我设法做到这一点的唯一方法):

var selectedMessages = _.chain(messages)
.sortBy('dateOfMessage')
.reverse()
.groupBy('messageHeaderId')
.map(function(a) {return a[0]}) // return latest message in thread
.map(function(b){
    return {
        content: b.content,
        dateOfMessage: b.dateOfMessage,
        headerId: b.messageHeaderId
        // count: ??
    }
})
.value();

console.log(selectedMessages);

这将线程中的最新消息作为新的对象数组提供给我,我只是缺少 count 属性。我尝试了 _.countBy 的各种组合,但我不确定如何将其放入返回的数组中。

我在这里用上面的代码创建了一个 jsfiddle:https://jsfiddle.net/xsfs0ua0/

【问题讨论】:

    标签: javascript arrays underscore.js


    【解决方案1】:

    您需要在 groupBy 之后,但在第一个 map 完成之前设置计数,因为在该地图中,您只返回一条记录

    我已经修改了小提琴:https://jsfiddle.net/xsfs0ua0/1/

    以下是相关更改:

    var selectedMessages = _.chain(messages)
        .sortBy('dateOfMessage')
        .reverse()
        .groupBy('messageHeaderId')
        .map(function(a) {
            // since returning only a[0], assign a new property 'count' with the size of the array
            a[0]['count'] = _.size(a);
            return a[0];
        })
        .map(function(b){...})
        .value();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      • 1970-01-01
      相关资源
      最近更新 更多