javascript - Javascript Array Map 意外更改了原始数组值
问题描述
我有创建对象的构造函数
我初始化了一个名为 的数组arr1
,调用该函数来生成起始值。
我映射arr1
到做arr2
但是我的原件arr1
被改变了。为什么是这样?是因为我在初始化数组和事件循环时进行了异步回调吗?
作为参考,我试图从我之前关于画布的帖子中获取想法进行重构
function point(x,y){
return {x,y}
}
arr1 = [point(1,2), point(3,4)];
console.log(arr1, "arr1");
arr2 = arr1.map(b=>{
b.x = b.x+2;
b.y = b.y+2;
return b;
})
console.log(arr1, "arr1");
console.log(arr2, "arr2");
解决方案
在您的map
回调中,您正在直接更改每个对象的属性 ( b
)...
b.x = b.x+2;
b.y = b.y+2;
我怀疑你追求的是更不可变的东西
const arr2 = arr1.map(({x, y}) => ({
x: x + 2,
y: y + 2
}))
这将创建一个具有 +2 值的新数组,而根本不修改原始数组。
function point(x,y){
return {x,y}
}
const arr1 = [point(1,2), point(3,4)];
console.log('arr1', arr1);
const arr2 = arr1.map(({x, y}) => ({
x: x + 2,
y: y + 2
}))
console.info('arr1', arr1);
console.info('arr2', arr2);
推荐阅读
- html - 将电子邮件另存为 PDF
- javascript - 对话框关闭时删除事件的问题(React useEffect)
- javascript - 递归不返回正确的结果
- python - 以特定的 json 格式保存 csv
- asp.net-mvc - 有没有办法区分特定的 System.Web.HttpException?
- r - 可视化对话中的眨眼
- swagger - springdoc / Swagger UI 未将 OAuth2 令牌传递给 API
- python - 使用 Pandas 读取 sql 查询的 Postgres 连接器类
- asp.net-core - 如何在 Blazor WebAssembly 中直接从服务器加载图像/视频?
- xamarin.forms - 当xamarin中的应用程序启动时间形成MVVM时如何创建视图模型实例