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

React中合并对象数组内嵌套子数组未获预期结果,求解决方案

问题分析

你当前的代码中,forEach循环调用ProfileDetails时,每次执行this.setState({ DataRows: newData })都会直接覆盖之前的DataRows状态值。第一次循环把第一个对象的consolidateddata赋值给DataRows,第二次循环又用第二个对象的consolidateddata覆盖了它,所以最终只保留了最后一组数据。

解决方案

推荐先一次性合并所有嵌套数组,再更新状态(避免多次调用setState,提升性能):

方法一:使用flatMap合并数组

修改componentDidMount方法,直接合并所有consolidateddata数组:

componentDidMount() {
  // 遍历data数组,提取每个item的consolidateddata并合并成一个数组
  const mergedData = data.flatMap(item => item.consolidateddata || []);
  this.setState({ DataRows: mergedData });
}

同时可以移除ProfileDetails方法,因为不再需要它。

方法二:函数式更新状态(保留forEach逻辑)

如果你想保留原有的forEach遍历逻辑,需要使用React的函数式状态更新,基于上一次的状态追加新数据:

ProfileDetails = (profileData) => {
  const newData = profileData.consolidateddata || [];
  // 使用prevState获取当前最新的状态,避免异步更新导致的覆盖问题
  this.setState(prevState => ({
    DataRows: [...prevState.DataRows, ...newData]
  }));
};

componentDidMount() {
  data.forEach(this.ProfileDetails);
}
修改后的完整代码示例

以下是使用方法一的完整代码:

import React from 'react';
import './style.css';

export const data = [
  {
    accountNo: '1xxx',
    consolidateddata: [
      { name: 'Paypal', expiry: '05/13/2023' },
      { name: 'phonepay', expiry: '05/19/2023' },
    ],
  },
  {
    accountNo: '2xxx',
    consolidateddata: [{ name: 'Paytm', expiry: '05/25/2023' }],
  },
];

export default class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      DataRows: [],
    };
  }

  componentDidMount() {
    const mergedData = data.flatMap(item => item.consolidateddata || []);
    this.setState({ DataRows: mergedData });
  }

  render() {
    console.log(this.state.DataRows);
    return (
      <div className="App">
        <h1>sample</h1>
      </div>
    );
  }
}

运行后,this.state.DataRows会包含预期的3个对象的合并数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:23:12