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

使用angular.copy复制对象数组时isChecked属性丢失求助

解决AngularJS angular.copy复制数组丢失自定义属性的问题

嘿,这个问题我之前也踩过坑!核心原因是**angular.copy在处理数组类型时,只会复制数组的索引元素,不会保留直接挂载在数组对象本身上的自定义属性**——你这里的TransformationRoadMap本质是一个数组,同时给它附加了isChecked属性,这就刚好触发了这个问题。

为什么会出现这种差异?

AngularJS的angular.copy对数组的处理逻辑是:创建一个新的空数组,然后遍历原数组的索引元素(也就是[0]、[1]、[2]这些),把每个元素深拷贝后放进新数组里。但那些直接加在数组对象上的额外属性(比如你的isChecked),不在数组的索引元素范围内,所以不会被复制。

而ValueTouchPoints没问题,是因为它本身就是一个普通对象,isChecked是这个对象的直接属性,angular.copy处理普通对象时会复制所有可枚举属性,所以自然保留了下来。

两种实用解决方案

方案1:把数组包装成对象(推荐)

最稳妥的方式是调整数据结构,把数组和它的自定义属性放在一个对象里,这样angular.copy就能完整复制所有内容:

// 修改原数据结构,将数组包装成包含items和isChecked的对象
var name = {
  TransformationRoadMap: {
    items: [{}, {}, {}], // 原数组元素
    isChecked: true
  },
  ValueTouchPoints: {
    ValueTouchPoints: [{}, {}, {}],
    ValueTouchPointsLink: [{}, {}, {}, {}, {}],
    isChecked: true
  }
};

// 现在复制就不会丢失属性了
var collectionFlyoutObject = angular.copy(name);

方案2:手动复制自定义属性

如果不想修改原数据结构,可以在angular.copy之后,手动把原数组上的自定义属性赋值给新数组:

var collectionFlyoutObject = angular.copy(name);

// 手动复制数组上的isChecked属性
collectionFlyoutObject.TransformationRoadMap.isChecked = name.TransformationRoadMap.isChecked;

// 如果还有其他自定义属性,也需要逐一手动复制

这样就能解决你遇到的数组属性丢失问题啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:00:58