【问题标题】:Split array of messages into conversations将消息数组拆分为对话
【发布时间】:2015-09-23 10:37:57
【问题描述】:

我正在为网站构建评论/消息系统,但遇到了有关消息的问题。

当我访问我网站上出售的物品时,我收到了该物品上的所有消息。我可以查看所有消息,因为该项目上的人只能给我发消息。

问题是将消息拆分为会话,因为我不希望消息混合在一起。

每条消息都有一个发送者和一个接收者,该发送者带有一个指向用户的 id,以及一个接收者,它也带有一个 id。

我尝试将其拆分为子数组,其中包含来自一个发件人的所有消息,但这不包括我发回的消息。

var messages = data.reduce(function (buckets, item) {
    if (!buckets[item._sender._id]) {
        buckets[item._sender._id] = [];
    }
    buckets[item._sender._id].push(item);
    return buckets;
}, {});

$scope.messagesBucket = _.values(messages);

如果我在控制台记录 messagesBucket,它看起来像这样

[Array[x], Array[y]] // each array is a conversation
  >0: Array[z] // each conversation is array of messages, but they don't include the ones i sent, which is my problem
  >1: Array[q]
...

所以我的问题是我不知道如何将所有消息分成对话。

使用 lodash 是一种奖励!

编辑(消息数据):

[
{
"_id": "5602858bb1f8f5ee05078ee0",
"_item": "5602858bb1f8f5ee05078ed9",
"content": "Det var billigt.",

"_sender": {
"_id": "56028589b1f8f5ee05078ec2",
"firstName": "Ole",
"lastName": "Wedel",
"image": "URL"
},

"_receiver": {
"_id": "56028589b1f8f5ee05078ec1",
"firstName": "Knud",
"lastName": "Larsen",
"image": "URL"
},
"__v": 0,
"timestamp": "2015-09-03T10:57:15.918Z"
},

{
"_id": "5602858bb1f8f5ee05078ee1",
"_item": "5602858bb1f8f5ee05078ed9",
"content": "Jeg vil lige tænke over det",

"_sender": {
"_id": "56028589b1f8f5ee05078ebe",
"firstName": "Oscar",
"lastName": "Andersen",
"image": "URL"
},

"_receiver": {
"_id": "56028589b1f8f5ee05078ec1",
"firstName": "Knud",
"lastName": "Larsen",
"image": "URL"
},
"__v": 0,
"timestamp": "2015-04-14T10:57:15.918Z"
},

{
"_id": "5602858bb1f8f5ee05078ee3",
"_item": "5602858bb1f8f5ee05078ed9",
"content": "Det går nok. Jeg har også andre jeg kan sælge til.",

"_sender": {
"_id": "56028589b1f8f5ee05078ec3",
"firstName": "Troels",
"lastName": "Sørensen",
"image": "URL"
},

"_receiver": {
"_id": "56028589b1f8f5ee05078ec1",
"firstName": "Knud",
"lastName": "Larsen",
"image": "URL"
},
"__v": 0,
"timestamp": "2014-11-12T11:57:15.918Z"
},

{
"_id": "5602858bb1f8f5ee05078eed",
"_item": "5602858bb1f8f5ee05078ed9",
"content": "Arh, jeg bliver nok nødt til at springe fra...",

"_sender": {
"_id": "56028589b1f8f5ee05078ec1",
"firstName": "Knud",
"lastName": "Larsen",
"image": "URL"
},

"_receiver": {
"_id": "56028589b1f8f5ee05078ec2",
"firstName": "Ole",
"lastName": "Wedel",
"image": "URL"
},
"__v": 0,
"timestamp": "2014-05-22T10:57:15.919Z"
}
]

【问题讨论】:

  • 请添加一些示例消息数据,这将使人们更容易回答!
  • 如果它解决了您的问题,请考虑接受答案。如果没有,请编辑您的问题以使其清楚。

标签: javascript arrays angularjs lodash


【解决方案1】:

因此,简而言之,您需要按每个唯一的发送者-接收者对对您的消息进行分组。 “唯一对”是指A+B与B+A相同;在我的代码中,我对它们进行了排序,所以这对总是相同的形式。

这样就可以了:

function groupConversations(messages) {
    return _.groupBy(messages, function(msg) {
        return _.sortBy([msg._sender._id, msg._receiver._id]).join(' ');
    })
}

【讨论】:

    【解决方案2】:

    感谢您的回复,我在一段时间后使用以下代码自行解决了这个问题

    function getItemMessages() {
                api.getItemMessages($scope.item._id)
                    .success(function (data, status) {
                        if (status === 200) {
                            // push all messages into seperate conversations
                            var conversations = data.reduce(function (buckets, message) {
                                // if the message is from the creator, don't add it to it's own bucket
                                if (message._sender._id === $scope.user._id) return buckets;
                                if (!buckets[message._sender._id]) {
                                    buckets[message._sender._id] = [];
                                }
                                buckets[message._sender._id].push(message);
                                return buckets;
                            }, {});
    
                            // find the messages by the owner, and push them into the conversation it belongs to
                            var keys = _.keys(conversations);
                            for (var i = 0; i < data.length; i++) {
                                if (data[i]._sender._id === $scope.user._id) {
                                    var index = keys.indexOf(data[i]._receiver._id);
                                    var key = keys[index];
                                    var conversation = _.get(conversations, key);
                                    conversation.push(data[i]);
                                }
                            }
    
                            $scope.messagesBucket = _.values(conversations);
                            if ($scope.messagesBucket.length > 0) {
                                $scope.changeCon($scope.messagesBucket[0]);
                            }
                        }
                    });
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 2022-06-15
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      相关资源
      最近更新 更多