Javascript 更新具有特定条件的对象数组中的元素

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

我有一个聊天室数组,每个聊天室都有一个messages数组属性

// 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