在Redux中更新对象前如何检查数组中是否存在该对象?
问题分析与解决方案
你的代码逻辑存在两个核心问题:
- 错误使用
map方法:map的作用是生成新数组,而非遍历执行修改/新增操作,且你在else分支中每次遍历不匹配元素时都会执行push,导致只要数组里有一个元素不匹配就重复新增对象。 - 未正确实现「先查找再更新/新增」的逻辑:你应该先判断目标对象是否存在,再执行对应操作,而非在遍历过程中分支处理。
修正后的代码
import { createSlice, PayloadAction } from "@reduxjs/toolkit"; interface Displate { name: string; finish: string; size: string; frame: string; price: number; quantity: number; } // 直接用 Displate[] 更简洁,无需继承 Array const initialState: Displate[] = []; export const cartSlice = createSlice({ name: "cart", initialState, reducers: { addDisplate: (state, action: PayloadAction<Displate>) => { // 先通过name查找是否存在目标对象 const existingDisplate = state.find(displate => displate.name === action.payload.name); if (existingDisplate) { // 存在则更新数量 existingDisplate.quantity++; } else { // 不存在则新增 state.push(action.payload); } }, }, }); export const { addDisplate } = cartSlice.actions; export default cartSlice.reducer;
补充说明
find方法能正确找到数组中第一个匹配name的对象,因为你是通过name字段判断唯一性,只要传入的action.payload.name和数组中对象的name一致就能匹配。- 你之前用
includes无效是因为includes判断的是对象引用是否相同,而非对象的属性值,除非你传入的是数组中已存在的同一个对象引用,否则无法识别。
内容的提问来源于stack exchange,提问作者ether
相关产品推荐
相关产品推荐

