You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redux reducer中array.filter参数仅包裹{}才生效的问题咨询

问题解析:Redux Reducer中Filter回调的参数问题

嘿,我刚看完你的代码,一下子就明白你遇到的困惑了!其实问题的核心很简单——你搞混了filter回调里的参数类型。

为什么直接用id参数不生效?

你的state(也就是defaultState.articles)是一个文章对象数组,不是单纯的id数组。当你写:

return state.filter(id => id !== action.id);

这里的id变量其实代表数组里的每一个完整的文章对象,而不是文章的id属性。你拿一个对象和action.id(数字/字符串类型)做比较,结果永远是false,所以过滤根本起不到作用,数组里的元素一个都不会被移除。

为什么用({id})就能正常工作?

这里用到了对象解构赋值的语法:

return state.filter(({id}) => id !== action.id);

它的作用是把每个文章对象里的id属性单独解构出来,作为回调函数的参数使用。这时候你拿的是文章的id属性(和action.id同类型)和action.id比较,逻辑就正确了,所以能顺利过滤掉对应id的文章。

另一种更直观的写法

如果你觉得解构有点抽象,也可以不用解构,直接访问对象的属性,效果是完全一样的:

return state.filter(article => article.id !== action.id);

这种写法把参数名改成article,明确表示它是一个文章对象,然后通过article.id获取id,新手更容易理解。

再结合你的代码验证一下

看你ADD case里的逻辑:return [...state, action.article];,你是把完整的文章对象添加到数组里的,所以数组里的每一项都是包含id属性的对象,这也进一步验证了上面的结论。

内容的提问来源于stack exchange,提问作者finepax007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:14:57