如何在修改其副本时避免更新原始数组? [复制]

Posted

技术标签:

【中文标题】如何在修改其副本时避免更新原始数组? [复制]【英文标题】:How to avoid updating of the original array while modifying its copy? [duplicate] 【发布时间】:2020-10-17 02:40:57 【问题描述】:

在下面的代码中,我创建了一个名为 update[] 的新数组,并使用 updateToCurrentYear() 函数修改其对象的 Date 属性。

但是,每当我尝试修改update[] 中的birthday 属性时,原始数组也会自动更新。我怎样才能避免这种情况?

function birthdaySearch() 
  var birthdays = [
     name: 'friend', birthday: new Date('03/25/1999') ,
     name: 'friend1', birthday: new Date('03/28/1999') ,
     name: 'friend2', birthday: new Date('09/25/1999') ,
     name: 'friend3', birthday: new Date('04/04/1999') ,
     name: 'friend4', birthday: new Date('07/05/1997') ,
     name: 'friend5', birthday: new Date('07/25/1998') 
  ];

  var nowDate = new Date();
  nowDate.setHours(0, 0, 0, 0);
  
  var nextMonth = nowDate.getMonth() + 1;
  var nextYear = nowDate.getFullYear() + 1;

  function updateToCurrentYear() 
    let update = [];
    birthdays.forEach(function(detail) 
      //.birthday.setFullYear(2020);
      update.push(detail);
    );
    
    update.forEach(function(update) 
      return update.birthday.setFullYear(nowDate.getFullYear());
    );
    
    console.log(update);
    return update;
  

  return 
    updateToCurrentYear: updateToCurrentYear,
  


birthdaySearchObj = birthdaySearch();
var current = birthdaySearchObj.updateToCurrentYear();

【问题讨论】:

【参考方案1】:

arr2=arr1 将指向同一个数组。 使用arr2=arr1.slice()复制。 (要比较数组,请使用:JSON.stringify(arr1)==JSON.stringify(arr2))。

【讨论】:

我的回答对您有帮助吗?如果是这样,请选择并投票。谢谢!【参考方案2】:

为避免复制值,您可以在此处使用spread operatormap

function updateToCurrentYear() 
  /*let update = [];
        
   birthdays.forEach( function(detail) 
      //.birthday.setFullYear(2020);
        update.push(detail);
    );*/
   const update = birthdays.map(b=>(...b));
        
   update.forEach( function(update) 
      return update.birthday.setFullYear(nowDate.getFullYear() );
   );
   console.log(update);  
   
   return update;

【讨论】:

以上是关于如何在修改其副本时避免更新原始数组? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

了解如何从内部函数更新原始二维数组

如何以及何时放弃在 C# 中使用数组?

我返回时如何避免复制

如何在 SQL Server 触发器中复制插入、更新、删除的行

修改副本时保持原始矢量不变

没有副本的Python切片? [复制]