JavaScript中数组赋值给对象属性仅保留首个元素是什么原因?
问题原因分析
你提供的测试代码本身运行后groupedDepActivities[0].term_activity.terms必然是长度为3的数组,出现仅保留第一个元素的情况,常见原因如下:
- 后续代码修改了terms数组:在push操作执行后、打印操作执行前,有其他逻辑对
groupedDepActivities[0].term_activity.terms做了截断、过滤或重赋值,比如使用splice(1)、slice(0,1)方法,或者错误的将数组第一个元素直接赋值给了terms属性。 - 控制台打印的延迟求值特性误导:浏览器控制台的
console.log打印的是对象的引用,展开对象时才会读取最新的属性值,如果在打印后修改了terms数组,就会出现打印时显示的长度和展开后的长度不一致的问题。 - 真实业务逻辑和测试代码不一致:如果你的实际项目中terms数组是从接口响应、第三方函数返回值获取的,很可能上游返回的数组本身就只有第一个元素,你写的硬编码测试案例和真实运行的赋值逻辑不符。
- 自定义序列化逻辑截断数组:如果赋值前对数据做了序列化/反序列化操作,对应对象上自定义的
toJSON方法会在序列化时只保留第一个元素。
解决方法
- 首先在push操作的下一行立刻执行
console.log(JSON.stringify(groupedDepActivities[0].term_activity.terms)),用序列化后的结果验证数组初始长度,避免控制台引用延迟的干扰。如果打印结果包含3个元素,即可确定问题出在后续的修改代码。 - 排查所有操作terms数组的逻辑,重点检查赋值语句是否错误将数组元素赋值给terms属性,而非整个数组,比如错误写法
terms = res.data.terms[0],正确写法为terms = res.data.terms。 - 如果terms取值自接口,先打印接口返回的原始数据,确认上游返回的数组长度符合预期。
- 检查所有涉及该对象的克隆、序列化操作,确认没有自定义逻辑截断数组。
内容的提问来源于stack exchange,提问作者Getaye
相关产品推荐
相关产品推荐

