Javascript 向已编制索引的对象添加新消息

Javascript 向已编制索引的对象添加新消息,javascript,vue.js,socket.io,Javascript,Vue.js,Socket.io,我创建了一个messenger,它将api的最后五条消息存储在索引对象中: data: function() { return { messages: { "0":{ "id":65, "body":"Hopefully last message", }, "1":{ "id":64, "body":"Another m

我创建了一个messenger,它将api的最后五条消息存储在索引对象中:

data: function() {
   return {
     messages: {  
         "0":{  
            "id":65,
            "body":"Hopefully last message",
         },
         "1":{  
            "id":64,
            "body":"Another message",
         },
         "2":{  
            "id":63,
            "body":"This work work?",
         },
         "3":{  
            "id":62,
            "body":"Yoo",
         },
         "4":{  
            "id":61,
            "body":"Hey again",
         }
      }
   }
},
我正在使用socket.io获取发送的最后一条消息,我要做的是将发送的最后一条消息推送到索引对象
this.messages
并移动索引,以便套接字接收的消息为“0”索引对象

mounted() {
   console.log("message mounted");

   let socket = io(`http://localhost:3000`);
   this.getOldMessages(this.conversationPath);

   socket.on('message', function (data) {

      data.message[0]

      //Shift data.message[0] into this.message object indexed as "0"

   }.bind(this));
},
//将对象转换为正确索引的数组
让messagesArr=Array.from(Object.keys(this.messages).sort((a,b)=>parseInt(a)this.messages[i]);
//从这里,您可以非常轻松地添加消息。
messagesArr.unshift(data.message[0]);
//最后,只需将其转换回一个对象(如果确实需要的话)
常数temp={};
messagesar.forEach((值,索引)=>temp[“”+索引]=值);
this.messages=temp;
//将对象转换为正确索引的数组
让messagesArr=Array.from(Object.keys(this.messages).sort((a,b)=>parseInt(a)this.messages[i]);
//从这里,您可以非常轻松地添加消息。
messagesArr.unshift(data.message[0]);
//最后,只需将其转换回一个对象(如果确实需要的话)
常数temp={};
messagesar.forEach((值,索引)=>temp[“”+索引]=值);
this.messages=temp;

如果我理解正确,您希望将
消息
处理得非常像一个可以取消转换的数组。所以你把它转换成一个数组,反移到它上面,然后再转换回来。这与puddi给出的答案相同,但您似乎对他的解决方案生成的消息的顺序有问题。我无法从你的评论中判断你是否期望它做一些与普通数组unshift不同的事情,或者他的是否做了一些奇怪的事情

newvue({
el:“#应用程序”,
数据(){
返回{
信息:{
"0": {
“id”:65,
“正文”:“希望是最后一条消息”,
},
"1": {
“id”:64,
“正文”:“另一条消息”,
},
"2": {
“id”:63,
“主体”:“这项工作?”,
},
"3": {
“id”:62,
“body”:“Yoo”,
},
"4": {
“id”:61,
“身体”:“又来了”,
}
}
}
},
方法:{
取消移位(消息){
常数arr=[];
const result={};
//与Object.keys类似,循环对象的关键点
Reflect.ownKeys(this.messages).forEach((k)=>{
//分配给相应的数组元素
arr[k]=this.messages[k];
});
//将消息放在数组的前面
arr.unshift(消息);
//将数组值和索引复制到结果对象中
arr.forEach((v,i)=>{
结果[i]=v;
});
返回结果;
}
},
安装的(){
//在邮件的前面添加新邮件
控制台日志(“消息装载”);
const newMessage={
身份证号码:66,
身体:'附言:我爱你'
};
this.messages=this.unshift(newMessage);
log(“Messages:,JSON.stringify(this.Messages));
}
});

如果我理解正确,您希望将
消息
处理得非常像一个可以取消转换的数组。所以你把它转换成一个数组,反移到它上面,然后再转换回来。这与puddi给出的答案相同,但您似乎对他的解决方案生成的消息的顺序有问题。我无法从你的评论中判断你是否期望它做一些与普通数组unshift不同的事情,或者他的是否做了一些奇怪的事情

newvue({
el:“#应用程序”,
数据(){
返回{
信息:{
"0": {
“id”:65,
“正文”:“希望是最后一条消息”,
},
"1": {
“id”:64,
“正文”:“另一条消息”,
},
"2": {
“id”:63,
“主体”:“这项工作?”,
},
"3": {
“id”:62,
“body”:“Yoo”,
},
"4": {
“id”:61,
“身体”:“又来了”,
}
}
}
},
方法:{
取消移位(消息){
常数arr=[];
const result={};
//与Object.keys类似,循环对象的关键点
Reflect.ownKeys(this.messages).forEach((k)=>{
//分配给相应的数组元素
arr[k]=this.messages[k];
});
//将消息放在数组的前面
arr.unshift(消息);
//将数组值和索引复制到结果对象中
arr.forEach((v,i)=>{
结果[i]=v;
});
返回结果;
}
},
安装的(){
//在邮件的前面添加新邮件
控制台日志(“消息装载”);
const newMessage={
身份证号码:66,
身体:'附言:我爱你'
};
this.messages=this.unshift(newMessage);
log(“Messages:,JSON.stringify(this.Messages));
}
});


是否有令人信服的理由说明
此.messages
不是数组?是否有令人信服的理由说明
此.messages
不是数组?很抱歉,我在注意到漏洞之前将其标记为答案。问题是,尽管最后发送的消息的索引为零,但它以错误的方式更改了所有其他消息的索引。所以,如果我有一堆消息,从最小的消息到第一个消息3,消息2,消息1,如果我收到消息4,顺序会变为消息4,消息1,消息2,消息3。很抱歉,在我注意到一个缺陷之前,我把它标记为答案。问题是,尽管最后发送的消息的索引为零,但它以错误的方式更改了所有其他消息的索引。所以,如果我有一堆消息,从最小的消息到第一个消息3,消息2,消息1,如果我收到消息4,顺序会变为消息4,消息1,消息2,消息3。很抱歉提前标记了您的回复。嘿,谢谢。你能在你的代码中添加一些注释吗。我对JS开发比较新,不熟悉t
// transform the object into a correctly indexed array
let messagesArr = Array.from(Object.keys(this.messages).sort((a, b) => parseInt(a) < parseInt(b)), i => this.messages[i]);

// from here, you can add the message pretty easily.
messagesArr.unshift(data.message[0]);

// finally, just transform it back into an object (if you really have to)
const temp = {};
messagesArr.forEach((value, index) => temp["" + index] = value);
this.messages = temp;