如何在reducer的immutable-js中删除嵌套状态对象?

时间:2019-08-24 16:54:35

标签: javascript reactjs react-redux immutable.js

我想从data中删除一个实体(这是对象someData中的List)。我在我的reducer中使用fromJS不变js来保持状态不变

我尝试使用updateIn, deleteIn, update, removeIn以及在immutable-js上可以找到的任何东西。但这对我没有用。我很可能是错误地使用了这些功能。

import { fromJS, updateIn } from 'immutable';
import * as type from './constants';

export const initialState = fromJS({
  someData: [],
  loading: true,
});

function someReducer(state = initialState, action) {
  switch (action.type) {
    case type.DELETE_SINGLE_ENTITY:
      updateIn(state, ['someData', 'data'], val =>
        val.filter(x => x.id !== action.id),      
      );
      return state;
    default:
      return state;
  }
}

export default someReducer;

//example someData

/*
{
    date: "",
    data: [
        {
            "id": "1",
            "machine_type": "xyz",
            "created_time": "2019-06-18T10:36:60Z",
            ...
        },
        {
            "id": "22",
            "machine_type": "abc",
            "created_time": "2019-06-20T10:36:60Z",
            ...
        },
        {
            "id": "2",
            "machine_type": "kjhkh",
            "created_time": "2019-06-11T12:36:60Z",
            ...
        }
    ]
}
*/

我想删除与操作中传递的ID相匹配的实体。 在上面的示例中,删除state.get('someData')的输出之前。当我键入action.id时,我的预期输出(当state.get为2时)应为:

{
    date: "",
    data: [
        {
            "id": "1",
            "machine_type": "xyz",
            "created_time": "2019-06-18T10:36:60Z",
            ...
        },
        {
            "id": "22",
            "machine_type": "abc",
            "created_time": "2019-06-20T10:36:60Z",
            ...
        }
    ]
}

2 个答案:

答案 0 :(得分:1)

最后!得到它了! 这个:

        item      dt_op  DQN_Pred  DQN_Inv
0  product_1 2019-01-08       6.0      7.0
1  product_2 2019-02-08       NaN      NaN
2  product_1 2019-01-08       2.0      2.0

代替此:

      return updateIn(state, ['someData', 'data'], val =>
        val.filter(x => x.id !== action.id),      
      );

以前,我认为updateIn会更新状态本身,但不会返回更新的对象。因此,只返回updateIn就可以了。

答案 1 :(得分:0)

您可以使用过滤器功能

const sampleData = [{id: 1},{id: 2},{id: 3}]

const idToRemove = 2;

const updatedData = sampleData.filter(el => {
  return el.id !== idToRemove
})

console.log(updatedData);