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

React中过滤对象数组内的嵌套services数组并更新state的实现方法

正确实现方案

原代码问题说明

  • 直接修改了原状态对象的services属性,违反React状态不可变更新原则
  • map遍历未返回处理后的对象,没有生成新的数组结构
  • 状态更新时向原数组追加元素,而非替换原有provider对象的services属性,逻辑完全不符合需求

正确实现代码

可以把要匹配的serviceType作为参数传入,提高函数复用性:

const filterServicesByType = (targetServiceType) => {
  // 不可变更新:生成全新的状态数组
  const updatedProviders = serviceProviders.map(provider => {
    // 过滤当前provider下符合条件的服务
    const filteredServices = provider.services.filter(
      service => service.serviceType === targetServiceType
    )
    // 返回新对象:保留原有所有属性,仅替换services为过滤后的结果
    return {
      ...provider,
      services: filteredServices
    }
  })
  // 直接传入新数组更新状态
  setServiceProviders(updatedProviders)
}

// 调用示例:过滤类型为Mental的服务
filterServicesByType('Mental')

如果担心当前获取的serviceProviders不是最新状态,可以用状态更新回调的写法:

const filterServicesByType = (targetServiceType) => {
  setServiceProviders(prevProviders => {
    return prevProviders.map(provider => {
      const filteredServices = provider.services.filter(
        service => service.serviceType === targetServiceType
      )
      return {
        ...provider,
        services: filteredServices
      }
    })
  })
}

可选优化

如果需要过滤掉没有符合条件服务的provider,可以在map后追加过滤逻辑,避免出现services为空数组的provider对象:

const updatedProviders = serviceProviders.map(/* 上述过滤逻辑 */)
  .filter(provider => provider.services.length > 0)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:45:08