在 Redux 中映射和更改状态

Maping and changing states in Redux

我有一个像下面这样的对象:

const initialState = {
  filters: {
    categories: [
      { text: "a", checked: true },
      { text: "b", checked: false },
      { text: "c", checked: false },
    ],
    brands: [
      { text: "d", checked: false },
      { text: "e", checked: true },
      { text: "f", checked: false },
    ],
    types: [
      { text: "g", checked: false },
      { text: "h", checked: true },
    ],
  },
};

我需要在点击时将所有选中的字段更改为 'false'。我正在使用 redux,这是我的初始状态。下面是我的功能,但它不能正常工作。它说“state.filters.map 不是函数”。

const filtersReducer = (state = initialState, action) => {
  switch (action.type) {
    case "RESET_ALL_STATES":
      return {
        ...state,
        filters: {
          ...state.filters,
          ...state.filters.map((filter) =>
            filter.map((option) =>
              option.checked === true ? { ...option, checked: false } : option
            )
          ),
        },
      };
    default:
      return state;
  }
};

以下解决方案使用 Object.entries 遍历 filter 对象内的所有 key/value 对,将每个数组的元素值重置为 checked: false.

const state={filters:{categories:[{text:"a",checked:!0},{text:"b",checked:!1},{text:"c",checked:!1}],brands:[{text:"d",checked:!1},{text:"e",checked:!0},{text:"f",checked:!1}],types:[{text:"g",checked:!1},{text:"h",checked:!0}]}};

const resetFilters = Object.entries(state.filters).reduce(
  (acc, [key, arr]) => {
    acc[key] = arr.map((el) => ({ ...el, checked: false }));
    return acc;
  },
  {}
);

console.log(resetFilters);

在你的减速器的上下文中,这可能看起来像:

const filtersReducer = (state = initialState, action) => {
  switch (action.type) {
    case "RESET_ALL_STATES":
      return {
        ...state,
        filters: Object.entries(state.filters).reduce(
          (acc, [key, arr]) => {
            acc[key] = arr.map((el) => ({ ...el, checked: false }));
            return acc;
          },
          {}
        ),
      };
    default:
      return state;
  }
};