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

如何在JavaScript/React中过滤深层嵌套数组同时保留父对象结构

解决方案

要保留完整的对象结构,仅过滤深层数组中isActive === false的元素,你需要逐层复制原对象的属性,只替换需要过滤的数组部分,而不是直接提取数组进行过滤。这样既保留了所有父节点数据,又得到了过滤后的数组。

方法一:逐层展开复制(高效推荐)

利用对象展开运算符...复制原对象的所有属性,仅替换第三层的source数组:

// 复制第一层source的所有属性,再处理第二层
const responseDataFiltered = {
  ...source,
  source: {
    // 复制第二层source的所有属性
    ...source.source,
    // 将第三层source替换为过滤后的数组
    source: source.source.source.filter(obj => obj.isActive)
  }
};

// 之后传入useState
setData(responseDataFiltered);

这种方式只会复制必要的层级,避免不必要的深拷贝,对于包含数千个元素的数组来说性能更优,同时能确保生成新的对象,触发React的状态更新。

方法二:深拷贝后修改(适合复杂结构)

如果原对象的嵌套结构更复杂,或者你需要完整复制整个对象再修改,可以使用structuredClone(现代浏览器及Node.js 17+支持):

// 深拷贝整个原对象
const clonedSource = structuredClone(source);
// 直接修改拷贝后的对象中的数组
clonedSource.source.source = clonedSource.source.source.filter(obj => obj.isActive);

// 传入useState
setData(clonedSource);

注意事项

  • 不要直接修改原source对象:React的状态更新依赖于新的引用,直接修改原对象无法触发组件重渲染,还可能导致不可预期的副作用。
  • 过滤条件可以简化:obj.isActive === true等价于直接写obj.isActive(因为isActive是布尔值),这样代码更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:18:20