Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.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_Vue.js_Lodash_Javascript Objects - Fatal编程技术网

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