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

向JavaScript对象添加多个元素时仅最后一个元素被加入的问题

问题原因与解决方案

你碰到的这个问题很典型——JavaScript里的对象是引用类型,你从头到尾都在修改同一个$scope.newMappings对象,然后多次把它push到insertList数组里。数组里存储的其实都是指向这个对象的"指针",所以当你最后一次修改对象属性时,数组里所有的"指针"指向的都是同一个更新后的对象,看起来就像只添加了最后一个元素。

解决办法有这几种,选你觉得顺手的就行:

1. 每次添加前创建全新的对象

直接每次初始化一个新的对象,而不是在原对象上修改:

// 第一个条目
$scope.newMappings = {
  sChannel: 'EST',
  sFormat: 'HD',
  sASIN: '',
  sLocalDescription: ''
};
insertList.push($scope.newMappings);

// 第二个条目
$scope.newMappings = {
  sChannel: 'EST',
  sFormat: 'SD',
  sASIN: '',
  sLocalDescription: ''
};
insertList.push($scope.newMappings);

2. 写个工具函数生成对象(减少重复代码)

如果要添加很多条目,写个复用的函数会更高效:

function createNewMapping(channel, format) {
  return {
    sChannel: channel,
    sFormat: format,
    sASIN: '',
    sLocalDescription: ''
  };
}

// 调用函数添加条目
insertList.push(createNewMapping('EST', 'HD'));
insertList.push(createNewMapping('EST', 'SD'));

3. 用对象复制的方式创建新实例

如果有基础的对象模板,用展开运算符或者Object.assign复制出一个新对象再修改:

// 先定义基础模板
const baseMapping = {
  sChannel: 'EST',
  sASIN: '',
  sLocalDescription: ''
};

// 复制模板并修改指定属性
insertList.push({...baseMapping, sFormat: 'HD'});
insertList.push({...baseMapping, sFormat: 'SD'});

// 或者用Object.assign的写法:
insertList.push(Object.assign({}, baseMapping, {sFormat: 'HD'}));

不管用哪种方式,核心都是每次push到数组里的是一个全新的对象引用,这样每个条目都是独立的,不会被后续的修改覆盖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:25:44