复制数组上的Javascript .map()

阿巴迪亚

我注意到,调用.map()而不将其分配给变量会使它返回整个数组,而不仅仅是返回更改后的属性:

const employees = [{
    name: "John Doe",
    age: 41,
    occupation: "NYPD",
    killCount: 32,
  },
  {
    name: "Sarah Smith",
    age: 26,
    occupation: "LAPD",
    killCount: 12,
  },
  {
    name: "Robert Downey Jr.",
    age: 48,
    occupation: "Iron Man",
    killCount: 653,
  },

]

const workers = employees.concat();

workers.map(employee =>
  employee.occupation == "Iron Man" ? employee.occupation = "Philantropist" : employee.occupation
);

console.log(employees);

但是考虑到.concat()创建了原始数组的副本并将其分配给worker,为什么员工也会发生突变?

尼克·帕森斯

发生这种情况是因为数组中的对象仍被相同的指针引用。(您的数组仍引用内存中的相同对象)。同样,Array.prototype.map()总是返回一个数组,并且它的结果应该分配给一个变量,因为它不进行就地映射。map方法中更改对象的属性时,应考虑.forEach()改为使用来修改复制的employees数组中的对象的属性。要复制员工数组,可以使用以下命令:

const workers = JSON.parse(JSON.stringify(employees));

请参见下面的示例:

const employees = [
  {
    name: "John Doe",
    age: 41,
    occupation: "NYPD",
    killCount: 32,
  },
  {
    name: "Sarah Smith",
    age: 26,
    occupation: "LAPD",
    killCount: 12,
  },
  {
    name: "Robert Downey Jr.",
    age: 48,
    occupation: "Iron Man",
    killCount: 653,
  },

]


const workers = JSON.parse(JSON.stringify(employees));
workers.forEach(emp => {
  if(emp.occupation == "Iron Man") emp.occupation = "Philantropist";
});

console.log("--Employees--")
console.log(employees);
console.log("\n--Workers--");
console.log(workers);

  • 注意:如果数据中包含任何方法,则需要使用另一种方法进行深度复制

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章