Javascript 将消息数组拆分为对话
我正在为一个网站建立一个评论/消息系统,我遇到了一个关于消息的问题 当我在我的网站上看到我要出售的商品时,我收到了该商品上的所有信息。我被允许查看所有消息,因为项目上的人只能给我发消息 问题是将消息拆分为对话,因为我不希望消息混合在一起 每条消息都有一个发送者和一个接收者,发送者的id表示用户,接收者的id也表示用户 我尝试将它拆分为子数组,其中包含来自一个发件人的所有消息,但这不包括我回复的消息Javascript 将消息数组拆分为对话,javascript,arrays,angularjs,lodash,Javascript,Arrays,Angularjs,Lodash,我正在为一个网站建立一个评论/消息系统,我遇到了一个关于消息的问题 当我在我的网站上看到我要出售的商品时,我收到了该商品上的所有信息。我被允许查看所有消息,因为项目上的人只能给我发消息 问题是将消息拆分为对话,因为我不希望消息混合在一起 每条消息都有一个发送者和一个接收者,发送者的id表示用户,接收者的id也表示用户 我尝试将它拆分为子数组,其中包含来自一个发件人的所有消息,但这不包括我回复的消息 var messages = data.reduce(function (buckets, ite
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;i谢谢您的回复,我用下面的代码自己解决了这个问题
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;i请添加一些示例消息数据,这将使人们更容易回答!如果它解决了你的问题,请考虑接受答案。如果没有,请编辑您的问题以使其清晰。请添加一些示例消息数据,这将使人们更容易回答问题!如果它解决了你的问题,请考虑接受答案。如果没有,请编辑您的问题以使其清楚。