分享
三行代码  ›  专栏  ›  技术社区  ›  Buk Lau

用reducer替换数组中的对象

  •  0
  • Buk Lau  · 技术社区  · 7 月前

    我想用id替换一个对象数组中的一个对象, 有效负载具有新对象

    const initialState = {
      allComments: []
    };
    
    case LIKE_COMMENT:
          let index = state.allComments.findIndex(
            value => value._id === payload._id
          );
          if (index === -1) {
            return {
              ...state,
              allComments: [...state.allComments, ...payload]
            };
          } else {
            return {
              ...state,
              allComments: [
                (state.allComments[index] = payload),
                ...state.allComments
              ]
            };
          }
    

    他们的问题是它一直在推动那个物体而没有替换上一个

    3 回复  |  直到 7 月前
        1
  •  2
  •   fila90    7 月前
     case LIKE_COMMENT:
          return {
            ...state,
            allComments: state.allComments.map(comment => {
              if (comment.id === payload._id) return payload;
              return comment;
            })
          }
    

    这将用有效负载替换注释并返回所有其他注释

        2
  •  1
  •   Seth Lutske    7 月前

    我认为在将旧数组返回到您的状态之前,您实际上需要根据旧数组定义一个新数组:

    ... else {
      newComments = state.allComments
      newComments[index] = payload
      return {
        ...state,
        newComments
      };
    }
    
        3
  •  1
  •   subarachnid    7 月前

    您可以使用map创建allComments数组的浅层副本,其中匹配的索引将替换为负载:

    case LIKE_COMMENT:
        return {
          ...state,
          allComments: state.allComments.map(c => c._id === payload._id ? payload : c)
        };