首页 > 解决方案 > Array.filter 是否制作了数组的克隆(副本)?

问题描述

我的理解是Array.filter创建了对象的克隆,但在下面的示例中 type1 和 type1a 显然共享一些数据。

let initial = [
   {id: 1, type: 1, name: "first", count:0},
   {id: 2, type: 2, name: "second", count:0},
   {id: 3, type: 1, name: "third", count:0},
   {id: 4, type: 2, name: "fourth", count:0},
];

let type1 = initial.filter((item)=>item.type===1);
let type1a = initial.filter((item)=>item.type===1);

type1[0].count = 2;

console.log(type1a[0].count);

结果:

Expected result: 0
Got: 2

我错过了什么?

我已经尝试在两个assignemnet中添加扩展运算符,但结果是一样的:(


感谢@Thomas 的回答。

供您参考,正确的代码是:

let initial = [
  { id: 1, type: 1, name: "first", count: 0 },
  { id: 2, type: 2, name: "second", count: 0 },
  { id: 3, type: 1, name: "third", count: 0 },
  { id: 4, type: 2, name: "fourth", count: 0 }
];

// let type1 = initial.filter(item => item.type === 1);
let type1 = [];
initial.forEach((item)=>{
  if(item.type === 1)
    type1.push(JSON.parse(JSON.stringify(item))
    )
})

// let type1a = initial.filter(item => item.type === 1);

  let type1a = [];
  initial.forEach((item)=>{
    if(item.type === 1)
      type1a.push(JSON.parse(JSON.stringify(item))
      )
  })

  type1[0].count = 2;

  console.log(type1[0].count);
  console.log(type1a[0].count);

标签: javascript

解决方案


您得到一个全新的数组,但该数组包含对对象的引用。引用被复制,但不是它们所引用的对象。这就是所谓的“浅”拷贝。

要制作完全独立的“深度”副本,请参阅此问题


推荐阅读