Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将消息数组拆分为对话_Javascript_Arrays_Angularjs_Lodash - Fatal编程技术网

Javascript 将消息数组拆分为对话

Javascript 将消息数组拆分为对话,javascript,arrays,angularjs,lodash,Javascript,Arrays,Angularjs,Lodash,我正在为一个网站建立一个评论/消息系统,我遇到了一个关于消息的问题 当我在我的网站上看到我要出售的商品时,我收到了该商品上的所有信息。我被允许查看所有消息,因为项目上的人只能给我发消息 问题是将消息拆分为对话,因为我不希望消息混合在一起 每条消息都有一个发送者和一个接收者,发送者的id表示用户,接收者的id也表示用户 我尝试将它拆分为子数组,其中包含来自一个发件人的所有消息,但这不包括我回复的消息 var messages = data.reduce(function (buckets, ite

我正在为一个网站建立一个评论/消息系统,我遇到了一个关于消息的问题

当我在我的网站上看到我要出售的商品时,我收到了该商品上的所有信息。我被允许查看所有消息,因为项目上的人只能给我发消息

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

每条消息都有一个发送者和一个接收者,发送者的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是一种奖励

编辑(消息数据):


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

这将有助于:

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

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

这将有助于:

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

谢谢你的回复,我用下面的代码自己解决了

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]);
                        }
                    }
                });
        }
函数getItemMessages(){ api.getItemMessages($scope.item.\u id) .成功(功能(数据、状态){ 如果(状态===200){ //将所有消息推送到单独的对话中 var conversations=data.reduce(函数(bucket、消息){ //如果消息来自创建者,不要将其添加到自己的bucket中 if(message.\u sender.\u id==$scope.user.\u id)返回bucket; 如果(!buckets[消息.\u发件人.\u id]){ bucket[消息发送方id]=[]; } bucket[message.\u sender.\u id].推送(message); 返回铲斗; }, {}); //由所有者查找消息,并将其推送到它所属的对话中 var keys=u0.keys(对话); 对于(变量i=0;i0){ $scope.changeCon($scope.messagesBucket[0]); } } }); }
谢谢您的回复,我用下面的代码自己解决了这个问题

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]);
                        }
                    }
                });
        }
函数getItemMessages(){ api.getItemMessages($scope.item.\u id) .成功(功能(数据、状态){ 如果(状态===200){ //将所有消息推送到单独的对话中 var conversations=data.reduce(函数(bucket、消息){ //如果消息来自创建者,不要将其添加到自己的bucket中 if(message.\u sender.\u id==$scope.user.\u id)返回bucket; 如果(!buckets[消息.\u发件人.\u id]){ bucket[消息发送方id]=[]; } bucket[message.\u sender.\u id].推送(message); 返回铲斗; }, {}); //由所有者查找消息,并将其推送到它所属的对话中 var keys=u0.keys(对话); 对于(变量i=0;i0){ $scope.changeCon($scope.messagesBucket[0]); } } }); }
请添加一些示例消息数据,这将使人们更容易回答!如果它解决了你的问题,请考虑接受答案。如果没有,请编辑您的问题以使其清晰。请添加一些示例消息数据,这将使人们更容易回答问题!如果它解决了你的问题,请考虑接受答案。如果没有,请编辑您的问题以使其清楚。