繁体   English   中英

为什么map()在嵌套数组中改变原始对象?

[英]why map() is mutating original objects in a nested array?

我正在尝试使用map()创建一个新的对象数组(usersData),以便添加一个从二级数组(国家/地区)分配值的新属性。 在我的测试中,我注意到我的原始对象数组(用户)已被修改,并且新属性(countryName)已添加到其中。 当我使用map为我的数组国家创建一个新的对象数组时,没有发生同样的情况。 有人能告诉我是什么导致了这个并帮助我理解如何避免这种行为?

const countries = [
  { id: 3, countryName : "UK" },
  { id: 4, countryName : "Spain" },
  { id: 6, countryName : "Germany"}
];

const users = [
  { id : 1,
    name: "Douglas Camp",
    dateOfBirth: "23-06-1984",
    contactDetails:
      {
        country: 3,
        phone: "7373724997"
      }
  },
  {
    id : 2,
    name: "Martin Stein",
    dateOfBirth: "19-08-1992",
    contactDetails:
      {
        country: 6,
        phone: "3334343434"
      }
  },
];

const usersData = users.map(user=> {
  const newUser = {};
  newUser.name = user.name;
  newUser.contactDetails = user.contactDetails;
  newUser.contactDetails.countryName = "UK";
  return newUser;
});

const countriesData = countries.map(country =>
  {
    const newCountry = {};
    newCountry.name = country.countryName;
    newCountry.continent = "Europe";
    return newCountry;
});
console.log(countries);  
console.log(countriesData); 
console.log(users);
console.log(usersData);

我希望数组用户中的元素保持其原始结构,但现在将属性contactDetails.countryName设置为“UK”

users.map()的每次迭代中, user.contactDetails保存对您存储在新newUser.contactDetailsobject的引用。 所以两者都会在内存中引用相同的对象。 在您的特定情况下,您可以解决这个问题,将user.contactDetails传播到一个新对象(就像克隆它一样)。 但请注意,这仅适用于1-level深度对象。 如果结构更复杂,则应搜索deep-cloning

 const countries = [{id:3,countryName:"UK"},{id:4,countryName:"Spain"},{id:6,countryName:"Germany"}]; const users = [{id :1,name:"Douglas Camp",dateOfBirth:"23-06-1984",contactDetails:{country:3,phone:"7373724997"}},{id :2,name:"Martin Stein",dateOfBirth:"19-08-1992",contactDetails:{country:6,phone:"3334343434"}},]; const usersData = users.map(user => { const newUser = {}; newUser.name = user.name; newUser.contactDetails = {...user.contactDetails}; newUser.contactDetails.countryName = "UK"; return newUser; }); const countriesData = countries.map(country => { const newCountry = {}; newCountry.name = country.countryName; newCountry.continent = "Europe"; return newCountry; }); console.log("countries:", countries); console.log("countriesData:",countriesData); console.log("users:", users); console.log("usersData:", usersData); 
 .as-console {background-color:black !important; color:lime;} .as-console-wrapper {max-height:100% !important; top:0;} 

你正在构建一个新阵列。 这并不意味着你也在构建一个新的一切 - 在阵列内部。

这个:

newUser.contactDetails = user.contactDetails;

正在重用原始数组元素中的user.contactDetails对象,所以这样:

newUser.contactDetails.countryName = "UK";

正在修改新数组和旧数组之间共享的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM