Redux Reducer - 基于id的过滤器数组,然后更改键/值对

时间:2017-08-25 09:42:42

标签: javascript ecmascript-6

我有一系列评论,我希望根据ID过滤并更改特定的键/值对。我的控制台日志功能返回数组中的正确项目,但我不确定正确的语法,用于获取.filter函数的结果并更改“喜欢的”项目。来自' false'真的'。如果它适用于这种情况,我可以使用扩展运算符。

import * as types from '../actions/actionTypes';
import initialState from './initialState';

export default function commentReducer(state = initialState.comments, action) {
  switch (action.type) {
    case types.ADD_COMMENT_LIKE_SUCCESS:
      const content = Object.assign({}, state);
      const likedComment = content.data.filter(comment => (
        comment.id === action.commentId
      ));
      console.log(likedComment[0]);
      break;

    default:
      return state;
  }
}

评论对象如下所示:

"data":{  
      "data":[  
         { id: '', comment: '', liked: false },
         { id: '', comment: '', liked: false },
         { id: '', comment: '', liked: false },
         { id: '', comment: '', liked: false }
      ],
      "cursor":"CkUKEQoEZGF0ZRIJCNrwhcWhvdUCEixqFGRldn5kZXZlbG9wbWVudC0xMzAwchQLEgdDb21tZW50GICAgLSe_-cKDBgAIAE=",
      "more":false,
      "count":4
   },

2 个答案:

答案 0 :(得分:0)

您正在使用过滤器功能,语法正确,尽管您的reducer应该返回带有该特定注释的所有注释,其中您喜欢的键值对为true,这样您就可以继续使用相同的地图功能

import * as types from '../actions/actionTypes';
import initialState from './initialState';

export default function commentReducer(state = initialState.comments, action) {
  switch (action.type) {
    case types.ADD_COMMENT_LIKE_SUCCESS:
      const content = Object.assign({}, state);
      content.data =  content.data.map(comment => {
                      const newObj = {...comment};
                      if(newObj.id === action.commentId)
                      { 
                            newObj.likeKey = true;
                      }
                      return newObj;
      }); 
     console.log(content);
     return content;   
    default:
      return state;
  }
}

Map functin将返回您到目前为止的所有评论,并更改该特定评论对象。希望这会有所帮助。

答案 1 :(得分:0)

我会使用find代替过滤器,因为它总是只返回一个项目。

我不完全确定你如何分裂你的州,但我建议你回复:

import * as types from '../actions/actionTypes';
import initialState from './initialState';

export default function commentReducer(state = initialState.comments, action) {
  switch (action.type) {
    case types.ADD_COMMENT_LIKE_SUCCESS:
      const otherComments = state.data;
      const likedComment = state.data.find(comment => (
        comment.id === action.commentId
      ));
      const index = state.data.indexOf(likedComment);

      return {
          ...state,
          data: {
              [
                  ...otherComments.slice(0, index),
                  { ...likedComment, liked: true }, //Override properties here
                  ...otherComments.slice(index + 1)
              ]
          }
      };

    default:
      return state;
  }
}

由于我没有修改状态,所以不需要来自州的复制内容。

基本上我是' m:

  1. 正在复制 state并覆盖data密钥...
  2. 所有评论的副本,并与我的副本 likedComment连接,但使用覆盖数据