アンダースコアを使用してオブジェクトの配列を操作するのに少し問題があります。私はほとんどそこにいますが、アンダースコアチェーン内でcountByを組み合わせようと試みています。下線sortBy、グループ化された配列の数を含むgroupBy
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によって識別される各スレッドにちょうど最新のメッセージを返すことです:
私は、オブジェクトの次の配列(簡体字)を持っていますオブジェクトの新しい配列
上記の配列の場合、groupByメソッドの後の各グループのメッセージ数のcountプロパティを持ち、返された最新のメッセージにプロパティとして追加される2つのオブジェクトの配列になります。
これは、配列をソートしてグループ化する方法です(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のさまざまな組み合わせを試してきましたが、返された配列にそれをどうやって取得するか分かりません。
私は上記のコードをここにjsfiddleを作成しました:https://jsfiddle.net/xsfs0ua0/