javascript - 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);
解决方案
您得到一个全新的数组,但该数组包含对对象的引用。引用被复制,但不是它们所引用的对象。这就是所谓的“浅”拷贝。
要制作完全独立的“深度”副本,请参阅此问题。
推荐阅读
- java - Swagger API 规范 - 自定义 API 响应属性 usign @ApiPropertyModel
- firebase - Firebase 在 Flutter Web 上无法运行,但在 android 模拟器上运行良好
- c++ - 使用 boost 计算天数。在 linux 版本 boost 1.74 上工作得很好,但在 MacOS 版本 boost 1.76 中给了我错误
- python - Django 大型查询集作为响应有效返回
- python - 如何为每个类别分年龄列
- angular - Angular 12,使用替换列表(占位符列表)进行拖放
- python - 使用 Python Pandas 仅在特定行和列上应用函数
- android - 是否需要安装 Android Studio 才能在 vscode 中使用模拟器?
- mysql - 如何从sql中的字符串拆分并获取特定值的列表
- cassandra - Flink 卡桑德拉地图
> 未找到编解码器问题