2017-08-17 3 views
1

アンダースコアを使用してオブジェクトの配列を操作するのに少し問題があります。私はほとんどそこにいますが、アンダースコアチェーン内で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/

答えて

0

あなたがそのマップにあなたが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(); 
関連する問題