Javascript 如何对消息中的文本进行分组?
你好! 我有一个聊天室,聊天室有一系列消息Javascript 如何对消息中的文本进行分组?,javascript,arrays,vue.js,lodash,javascript-objects,Javascript,Arrays,Vue.js,Lodash,Javascript Objects,你好! 我有一个聊天室,聊天室有一系列消息 [{"id":4, "user_id":1, "messageable_id":3, "messageable_type":"conversation", "text":"Text 1", "action":null, "target_id":null, "created_at":"2019-06-17 15:47:55", "updated_at":"2019-06-17 15:47:55", "replies":[], "files":[]},
[{"id":4,
"user_id":1,
"messageable_id":3,
"messageable_type":"conversation",
"text":"Text 1",
"action":null,
"target_id":null,
"created_at":"2019-06-17 15:47:55",
"updated_at":"2019-06-17 15:47:55",
"replies":[],
"files":[]},
{"id":5,
"user_id":1,
"messageable_id":3,
"messageable_type":"conversation",
"text":"Text 2",
"action":null,
"target_id":null,
"created_at":"2019-06-17 15:48:00",
"updated_at":"2019-06-17 15:48:00",
"replies":[],
"files":[]}]
如果时差小于60秒,我想将消息文本合并到一条消息中
[{"id":4,
"user_id":1,
"messageable_id":3,
"messageable_type":"conversation",
"grouped_text":["Text 1","Text 2"], //GROUP
"action":null,
"target_id":null,
"created_at":"2019-06-17 15:47:55",
"updated_at":"2019-06-17 15:47:55",
"replies":[],
"files":[]}]
我试试这个代码
let messages = this.$store.getters['conversation/messages'](this.conversation);
let grouped = _.groupBy(messages, message => {
return this.$moment(message.created_at).startOf('minute');
});
我怎样才能做得更好?我可以用lodash
提前感谢您您可以使用
reduce
。如果上一条消息在处创建的和当前消息在
处创建的的差异小于1分钟(或60000ms),则将消息推送到累加器中最后一个项目的分组文本
。否则,使用grouped\u text
属性将新消息推送到累加器
您可以分别获取每条消息的文本和属性
const messages=[{“id”:4,“user_id”:1,“messageable_id”:3,“messageable_type”:“conversation”,“text”:“text 1”,“action”:null,“target_id”:null,“created_at”:“2019-06-17 15:47:55”,“updated_at”:“2019-06-17 15:47:55”,“represponses”:[],“files”:[]},{“id”:5,“user_id”:1,“messageable_id”:3,“messageable_type”:“conversation”,“text”:“text 2”,“action”:null,“target_id”:null,“创建于”:“2019-06-17 15:48:00”,“更新于”:“2019-06-17 15:48:00”,“回复”:[],“文件”:[]}]
常量组日期=(日期1,日期2)=>(新日期(日期1)-新日期(日期2)<60000)
const group=messages.reduce((r,{text,…rest},i,arr)=>{
常数prev=arr[i-1];
if(上一个和组日期(rest.created\u at,上一个created\u at))
r[r.length-1]。分组的文本。推送(文本)
其他的
r、 推送({…rest,分组的文本:[text]})
返回r;
}, [])
console.log(分组)
您可以使用reduce
。如果在
处创建的上一条消息的与在
处创建的当前消息的差异小于1分钟(或60000ms),将消息推送到累加器中最后一个项目的grouped_text
。否则,使用grouped_text
属性将新消息推送到累加器
您可以分别获取每条消息的文本和属性
const messages=[{“id”:4,“user_id”:1,“messageable_id”:3,“messageable_type”:“conversation”,“text”:“text 1”,“action”:null,“target_id”:null,“created_at”:“2019-06-17 15:47:55”,“updated_at”:“2019-06-17 15:47:55”,“responses”:[],“files”:[]},{“id”:5,“user_id”:1,“messageable_id”:3,“messageable_type”:“conversation”,“text”:“text 2”,“action”:null,”目标id:null,“创建时间”:“2019-06-17 15:48:00”,“更新时间”:“2019-06-17 15:48:00”,“回复”:[],“文件”:[]}]
常量组日期=(日期1,日期2)=>(新日期(日期1)-新日期(日期2)<60000)
const group=messages.reduce((r,{text,…rest},i,arr)=>{
常数prev=arr[i-1];
if(上一个和组日期(rest.created\u at,上一个created\u at))
r[r.length-1]。分组的文本。推送(文本)
其他的
r、 推送({…rest,分组的文本:[text]})
返回r;
}, [])
console.log(grouped)
lodash的groupBy
-函数不是用于此操作的合适工具。groupBy
-函数将把与键匹配的所有消息对象(在您的情况下,同一分钟内的所有消息)放入一个数组中
您可以使用reduce
-功能。假定消息
(您问题中提到的消息)按日期排序:
const messages=[{“id”:4,“user_id”:1,“messageable_id”:3,“messageable_type”:“conversation”,“text”:“text 1”,“action”:null,“target_id”:null,“created_at”:“2019-06-17 15:47:55”,“updated_at”:“2019-06-17 15:47:55”,“responses”:[],“files”:[]},{“id”:5,“user_id”:1,“messageable_id”:3,“messageable_type”:“conversation”,“text”:“text 2”,“action”:null,”target_id:null,“创建于”:“2019-06-17 15:48:00”,“更新于”:“2019-06-17 15:48:00”,“回复”:[],“文件”:[]}];
const result=消息。reduce((结果,消息)=>{
const lastMessage=result[result.length-1];
如果(!lastMessage | |新日期(message.created_at)–新日期(lastMessage.created_at)>=60000){
message.group_text=[message.text]
删除message.text;
结果推送(消息);
}否则{
lastMessage.group\u text.push(message.text);
}
返回结果;
}, []);
console.log(result);
lodash的groupBy
-函数不是用于此操作的合适工具。groupBy
-函数将把与键匹配的所有消息对象(在您的情况下,同一分钟内的所有消息)放入一个数组中
您可以使用reduce
-功能。假定消息
(您问题中提到的消息)按日期排序:
const messages=[{“id”:4,“user_id”:1,“messageable_id”:3,“messageable_type”:“conversation”,“text”:“text 1”,“action”:null,“target_id”:null,“created_at”:“2019-06-17 15:47:55”,“updated_at”:“2019-06-17 15:47:55”,“responses”:[],“files”:[]},{“id”:5,“user_id”:1,“messageable_id”:3,“messageable_type”:“conversation”,“text”:“text 2”,“action”:null,”target_id:null,“创建于”:“2019-06-17 15:48:00”,“更新于”:“2019-06-17 15:48:00”,“回复”:[],“文件”:[]}];
const result=消息。reduce((结果,消息)=>{
const lastMessage=result[result.length-1];
如果(!lastMessage | |新日期(message.created_at)–新日期(lastMessage.created_at)>=60000){
message.group_text=[message.text]
删除message.text;
结果推送(消息);
}否则{
lastMessage.group\u text.push(message.text);
}
返回结果;
}, []);
console.log(result);
请添加您尝试的代码i只需尝试lodash函数GroupBy和moment请添加您尝试的代码i只需尝试lodash函数GroupBy和moment