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

在Redux中更新对象前如何检查数组中是否存在该对象?

问题分析与解决方案

你的代码逻辑存在两个核心问题:

  1. 错误使用map方法:map的作用是生成新数组,而非遍历执行修改/新增操作,且你在else分支中每次遍历不匹配元素时都会执行push,导致只要数组里有一个元素不匹配就重复新增对象。
  2. 未正确实现「先查找再更新/新增」的逻辑:你应该先判断目标对象是否存在,再执行对应操作,而非在遍历过程中分支处理。

修正后的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:10:23