如何在反应中过滤状态数组?

Posted

技术标签:

【中文标题】如何在反应中过滤状态数组?【英文标题】:How can I filter array of state in react? 【发布时间】:2017-05-31 05:08:21 【问题描述】:

我有 order reducer,它有很多状态。

const initialState = 
 channel: null,
 order: ,
 fetching:true,
 menu: [],
 categories: [],
 subcategories: [],
 currentCategoryId: 1,
 currentSubcategoryId: 5,
 currentMenu: [],
;

我要过滤的是menumenu 是状态数组,其对象为 menu_item 我有 currentCategoryIdcurrentSubcategoryId。我想对这些状态做的是通过使用currentCategoryIdcurrentSubcategoryId 过滤menu 并将过滤后的状态放入currentMenu

case Constants.ORDER_CHANNEL_CONNECTED:
 return
  ...state,currentMenu: action.menu.map((menu) => 
                    if(state.currentCategoryId == menu.category_id)
                        return menu;
                    
                    else return false;

为此,我编写了上面的代码。即使它返回一些过滤值,它也会显示相同数量的具有许多错误值的数组。我想找到其他方法来做到这一点..

我该怎么做?

提前致谢。

【问题讨论】:

【参考方案1】:

请使用filter函数:

...state,currentMenu: action.menu.filter((menu) =>
state.currentCategoryId == menu.category_id)

P.S:我同意下面的回答,最好使用 Immutable.js

【讨论】:

为什么你认为使用 Immutable.js 更好?与仅使用 filter 函数相比有什么好处吗? 使用不可变的主要原因是避免昂贵的克隆整个对象。不可变对象存储与以前版本的唯一区别。它的工作速度更快,尤其是在具有大状态对象的大型项目中。你可以阅读更多关于福利here【参考方案2】:

我会说您可以为此目的使用 immutable.js。您可以将filter 添加到您的地图中。

你可以试试

Immutable.map(state.menu).filter(state.currentCategoryId===menu.category_id)

P.S:我还没有测试过上面的代码,但只要稍加修改它就可以工作。

您可以查看有关不可变here的更多信息

【讨论】:

谢谢,我尝试了currentMenu: Immutable.map(state.menu).filter(state.currentCategoryId===menu.category_id),但它触发了Immutable.map is not defined 的错误。所以我尝试了Immutable.Map(state.menu)....,但它仍然触发了menu is not defined 的错误我应该如何更改?【参考方案3】:
onTodoClick(id)
      this.setState(items: this.state.items.filter(item => item.news_id == id )
      );
    

【讨论】:

【参考方案4】:

如果您按 ID 过滤并且它是数字,请注意比较字符串和数字。我不得不使用 parseInt (如下)。

Arr.filter(single => parseInt(single.id) !== parseInt(id))

如果 javascript 过滤器数组不起作用,请考虑这一点

【讨论】:

以上是关于如何在反应中过滤状态数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在反应原生中过滤多个选择下拉字段中的数组值

如何在反应中的对象数组中设置对象数组的状态

如何在反应中从状态数组中添加或删除项目

如何在反应原生中过滤FlatList中的项目

如何在反应原生 Firestore 中过滤 TRUE FALSE 选项

如何正确更新反应钩子状态中的数组