Javascript 更新具有特定条件的对象数组中的元素
我有一个聊天室数组,每个聊天室都有一个messages数组属性Javascript 更新具有特定条件的对象数组中的元素,javascript,redux,react-redux,immutability,Javascript,Redux,React Redux,Immutability,我有一个聊天室数组,每个聊天室都有一个messages数组属性 // state const INITIAL_STATE = { myRooms: { rooms: [], isLoading: false, isLoaded: false, isError: false, }, }; 房间及其图元定义为: { "creator": { &qu
// state
const INITIAL_STATE = {
myRooms: {
rooms: [],
isLoading: false,
isLoaded: false,
isError: false,
},
};
房间及其图元定义为:
{
"creator": {
"username": "LangCodex"
},
"joiner": {
"username": "Bingo"
},
"date_created": "2020-10-04T19:23:01.380918",
"messages": [],
"name": "9496dd0a223f712f4a9d2f3fba4a0ab0",
"status": "offline"
}
消息及其元素定义如下:
{
"author": {
"username": "Bingo"
},
"recipient": {
"username": "LangCodex"
},
"body": "hello",
"date": "2020-10-07T11:11:25.828269",
"id": 602,
"room": "9496dd0a223f712f4a9d2f3fba4a0ab0",
"seen": false,
"type": "text"
},
我的reducer定义如下,它接收字符串roomName类型的数据,通过该类型我选择要将其消息的SEED属性设置为true的房间
case 'MARK_CHAT_AS_READ': {
const roomIndex = state.myRooms.rooms.findIndex(r => r.name === action.payload.roomName);
// magic happens here
return {...state}
}
我已经为这个问题挣扎了很长一段时间了。任何帮助都将不胜感激
编辑:
我要做的是将roomIndex返回其索引的文件室的每条消息的“seed”属性设置为true。类似的操作应该可以实现这一目的
case 'MARK_CHAT_AS_READ': {
return {
...state, // copy state
myRooms: {
...state.myRooms, // copy myRooms
rooms: state.myRooms.rooms.map(room => { // create new rooms array
// keep room untouched if the name is different
if (room.name !== action.payload.roomName) return room;
return { // create new room
...room,
// with new messages array, containing updated values
messages: room.messages.map(message => ({...message, seen: true}))
};
}),
}
}
}
但是。您应该更好地使用和避免嵌套更新。类似的方法应该可以做到这一点
case 'MARK_CHAT_AS_READ': {
return {
...state, // copy state
myRooms: {
...state.myRooms, // copy myRooms
rooms: state.myRooms.rooms.map(room => { // create new rooms array
// keep room untouched if the name is different
if (room.name !== action.payload.roomName) return room;
return { // create new room
...room,
// with new messages array, containing updated values
messages: room.messages.map(message => ({...message, seen: true}))
};
}),
}
}
}
但是。您应该更好地避免嵌套更新。您能详细说明一下,您到底想在这里完成什么吗?@MAS,很抱歉,我补充了一些关于我想做什么的解释。您能详细说明一下,您到底想在这里完成什么吗?@MAS,很抱歉,不够清楚,我添加了一点解释,说明了我要做的事情。这成功了,谢谢你的回答和建议。非常感谢,@TarabankoThis成功了,谢谢你的回答和建议。非常感谢,@Tarabanko