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

Ag-grid中addRow操作意外修改原始rowData的问题求助

解决Ag-Grid中添加行后原始数据被修改的问题

嘿,这个问题我太熟悉了!核心原因是JavaScript里数组是引用类型,你在addRow里写let rowData = this.rowData的时候,并没有创建新数组,只是把指向this.rowData的引用赋值给了局部变量rowData。所以你对rowData做的unshift操作,其实直接修改了原来的this.rowData数组——这就是为什么控制台打印this.rowData会变成7行的原因。

下面给你一步步的解决方案:

1. 先保存原始数据的深拷贝

首先在首次加载数据的时候,要把原始数据单独存一份深拷贝,这样后续不管怎么修改当前表格数据,原始备份都不会变:

// 原始数据加载逻辑修改
this._Service.httpPost(Request, Url).subscribe(data => { 
  responseJson = JSON.parse(JSON.stringify(data)); 
  this.rowData = responseJson; 
  // 新增:保存原始数据的深拷贝,用于reset恢复
  this.originalRowData = JSON.parse(JSON.stringify(responseJson));
  this.gridOptions.api.setRowData(this.rowData); // 初始显示6行
});

2. 修改addRow函数,操作数组的拷贝而非原引用

在添加行的时候,要先创建当前this.rowData的拷贝,再对拷贝进行修改,这样就不会影响原数组了:

addRow() { 
  // 方式1:浅拷贝(适用于行数据是简单值或不需要修改嵌套对象的场景)
  let rowData = [...this.rowData]; 
  // 方式2:深拷贝(如果行数据包含嵌套对象,推荐用这个)
  // let rowData = JSON.parse(JSON.stringify(this.rowData));

  rowData.unshift(newData); // 给拷贝后的数组添加新行
  this.gridOptions.api.setRowData(rowData); // 更新表格数据
  this.rowData = rowData; // 同步更新当前rowData为新的数组
}

3. 实现reset函数恢复原始数据

现在有了originalRowData这个原始备份,reset的时候直接用它来恢复就可以了:

reset() {
  // 同样用深拷贝,避免后续修改影响原始备份
  this.rowData = JSON.parse(JSON.stringify(this.originalRowData));
  this.gridOptions.api.setRowData(this.rowData);
}

补充说明

  • 浅拷贝([...arr]或arr.slice()):只拷贝数组本身,数组里的对象还是引用原对象,如果你的行数据是简单对象且不会修改嵌套属性,用这个足够,性能也更好。
  • 深拷贝(JSON.parse(JSON.stringify(arr))):会把数组和里面的所有嵌套对象都拷贝成新的,适合复杂数据结构,但注意如果数据里有函数、Symbol等特殊类型,这个方法会丢失这些数据,这种情况可以考虑用lodash的cloneDeep方法(不过需要额外引入库)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:48:16