快问问题,我正在使用扩展语法组合两个对象,新对象由前两个对象的键自动排序,我不希望我的新对象按键排序(因为我希望用户看到较旧的对话)我上面的redux状态和新获得的对话)。我该怎么办?
这是我的reducer,它接受一系列对话(数组第一次有3个对话,然后是另一个点击+1),并根据对话ID创建对象
case actions.SET_CONVERSATION_MESSAGES: {
let convos = {};
payload.chatinbox.forEach(message => {
if (state[ message.chatsession_id ]) {
convos = Object.assign(convos, {
[ message.chatsession_id ]: {
messages: [...state[ message.chatsession_id ].messages, message]
}
});
} else if (!state[ message.chatsession_id ]) {
convos = Object.assign(convos, {
[ message.chatsession_id ]: {
messages: [message]
}
});
}
});
return {
...convos,
...state
};
}
这是状态对象的外观
{
14632: {},
14652: {},
14741: {}
}
当一个新会话进来时,其中有一个适合其间的键
{
14542: {}
}
新对象按其自动排序
{
14632: {},
14542: {},
14652: {},
14741: {}
}
我想要的结果是
{
14632: {},
14652: {},
14741: {},
14542: {}
}
出于显而易见的原因,为了向用户显示之前获取的内容以及之后获取的内容,我该怎么办?
答案 0 :(得分:4)
Objects don't guarantee order,因此可以根据浏览器的实现来改变密钥。如果要维护订单,请考虑使用带有ID的对象数组。
如果您使用ID直接访问该对象,如果您转换为使用带ID的对象数组,则可能会发现array.find
有用。