Redux中如何删除嵌套数组内ID匹配的元素
问题根因
- 匹配逻辑错误:图片项的
id是单个值(数字或字符串类型),你调用的includes是数组/字符串的模糊匹配方法,数字类型的id调用该方法会直接抛出类型错误导致逻辑终止;就算是字符串类型id,模糊匹配也会出现误删(比如id为img-12时,传入img-1也会被匹配删除),不符合精确匹配ID的需求。 - (可选优化点)当前逻辑会遍历所有商品的图片列表,删除所有商品下ID匹配的图片,如果你的业务需求是仅删除指定商品下的对应图片,还需要补充商品ID的匹配逻辑。
修复代码
场景1:全局删除所有商品下匹配ID的图片
仅修改匹配逻辑为精确全等判断即可:
case appConstants.DELETE_IMAGE_SUCCESS: return { ...state, products: state.products.map((product) => ({ ...product, productImages: (product.productImages ?? []).filter( ({ id }) => id !== action.payload // 若ID和payload类型可能不统一(比如一个是数字一个是数字字符串),可以改为 String(id) !== String(action.payload) ) })) };
场景2:仅删除指定商品下的对应图片(更符合通用业务场景)
如果你的删除请求同时携带了所属商品ID和图片ID,可使用该方案减少不必要的遍历:
case appConstants.DELETE_IMAGE_SUCCESS: return { ...state, products: state.products.map((product) => { // 非目标商品直接返回,不做处理 if (product.id !== action.payload.productId) return product return { ...product, productImages: (product.productImages ?? []).filter( ({ id }) => id !== action.payload.imageId ) } }) };
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

