Javascript Object.assign保留对原始对象的引用

Javascript Object.assign保留对原始对象的引用,javascript,babeljs,Javascript,Babeljs,我有一个方法: export const groupActivities = ({ activities, tags, images, tickets }) => { if (!activities || !tags) { console.error('Must have activities and tags'); } const groupActivities = Object.assign({}, activities); const groups = g

我有一个方法:

export const groupActivities = ({ activities, tags, images, tickets }) => {
  if (!activities || !tags) {
    console.error('Must have activities and tags');
  }

  const groupActivities = Object.assign({}, activities);

  const groups = groupByTags({ activities: groupActivities, tags });

  groups.forEach(group => {
    group.length = group.activities.length;
    console.log(group.length);
    group.activities.forEach(activity => {
      if (images) {
        activity.images = activity.imageIds.map(id => images[id]);
      }

      if (tickets) {
        console.warn('No tickets provided to the groupactivities helper. May cause problems.');
        activity.tickets = activity.ticketIds.map(id => tickets[id]);
      }
    });
  });

  return groups;
};
Object.assign正在复制activities对象,但仍然保留对它的引用,因此如果我找到一个特定的activity并更改它的某些属性,它也会更改原始属性!(更改groupActivities['someID'].name='name'会更改activities对象上的相应活动!)

这导致了一些奇怪的错误。有解决办法吗


使用babel 5进行编译。

事实上,这可以通过不同的方式完成:

  • 若不希望外部导入,但考虑嵌套对象,则实现您自己的。我实现了我自己的,如下所示(如果你有一个嵌套对象,你需要深度克隆,所以设置
    deep=true
    ):
  • 函数cloneObj(obj,deep=false){
    var result={};
    用于(输入obj){
    if(对象的深和对象[key]实例){
    if(obj[key]数组实例){
    结果[键]=[];
    obj[key].forEach(功能(项){
    if(对象的项目实例){
    结果[key].push(cloneObj(item,true));
    }否则{
    结果[键]。推送(项);
    }
    });
    }否则{
    结果[key]=cloneObj(obj[key]);
    }
    }否则{
    结果[键]=对象[键];
    }
    }
    返回结果
    }
    //浅拷贝
    var newObject=cloneObj(oldObject);
    //深度复制
    var newObject=cloneObj(oldObject,true);
    
  • 使用jQuery
  • //浅拷贝
    var newObject=jQuery.extend({},oldObject);
    //深度复制
    var newObject=jQuery.extend(true,{},oldObject);
    
  • 使用:
  • //浅拷贝
    var newObject=\ u0.clone(oldObject);
    
    PS:我用以下数据测试了我的功能,效果良好:

    var oldObject={a:1,b:{d:2,c:6},c:[1,2,{t:1}]};
    newObject=cloneObj(oldObject,true);
    新对象['b']['d']=8;
    newObject['a']=8;
    新对象['c'][2]['t']=5;
    console.log(oldObject)
    console.log(newObject)
    
    Object.assign创建浅拷贝,因此需要子对象引用链接。请参阅关于“克隆对象”以断开链接。如果您不需要继承、日期或方法,
    JSON.parse(JSON.stringify(obj))
    可以快速复制普通对象,而无需烦人的外部引用。“有解决方案吗?”进行深度复制。请阅读标签说明!是关于这个名字的Python库的问题。我确实需要一个深度副本,因此我想
    Object.assign
    会做一个深度副本吗?我没有使用jquery,只是ES6是的,不管你听到了什么,你现在都有了正确的答案。