下划线 sortBy, groupBy 与分组数组的计数
Underscore sortBy, groupBy with count of grouped arrays
我在使用下划线操作对象数组时遇到了一些问题。我快到了,但一直坚持尝试在下划线链中组合 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"
}
];
我的目标是 return 每个线程中的最新消息(由 messageHeaderId 标识)以及线程中的消息计数作为新的对象数组。
因此,根据上面的数组,这将产生一个包含 2 个对象的数组,这些对象在 groupBy 方法之后具有每个组中消息数的计数 属性,并作为 属性 添加到returned 最新消息。
这是我用来对数组进行排序和分组的方法(我不确定使用 2 个映射函数是否是个好主意(?),但这是我做到这一点的唯一方法):
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);
这为我提供了线程中作为新对象数组的最新消息,我只是缺少计数 属性。我已经尝试了 _.countBy 的各种组合,我只是不确定如何将其放入 returned 数组。
我在这里用上面的代码创建了一个 jsfiddle:https://jsfiddle.net/xsfs0ua0/
您需要在 groupBy
之后但在第一个 map
完成之前设置计数,因为在该映射中您只返回 一条记录 .
我修改了fiddle: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();
我在使用下划线操作对象数组时遇到了一些问题。我快到了,但一直坚持尝试在下划线链中组合 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"
}
];
我的目标是 return 每个线程中的最新消息(由 messageHeaderId 标识)以及线程中的消息计数作为新的对象数组。
因此,根据上面的数组,这将产生一个包含 2 个对象的数组,这些对象在 groupBy 方法之后具有每个组中消息数的计数 属性,并作为 属性 添加到returned 最新消息。
这是我用来对数组进行排序和分组的方法(我不确定使用 2 个映射函数是否是个好主意(?),但这是我做到这一点的唯一方法):
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);
这为我提供了线程中作为新对象数组的最新消息,我只是缺少计数 属性。我已经尝试了 _.countBy 的各种组合,我只是不确定如何将其放入 returned 数组。
我在这里用上面的代码创建了一个 jsfiddle:https://jsfiddle.net/xsfs0ua0/
您需要在 groupBy
之后但在第一个 map
完成之前设置计数,因为在该映射中您只返回 一条记录 .
我修改了fiddle: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();