提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前情提要
有一个接口,要求实现的是传给后端同学的数据为很多个相同对象组成的数组,只是ID不一样,类似[{a:1,b:2,c:3,id:x},{a:1,b:2,c:3,id:x},{a:1,b:2,c:3,id:x},{a:1,b:2,c:3,id:x},{a:1,b:2,c:3,id:x},{a:1,b:2,c:3,id:x}]
一、实现需求并发现问题
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
最开始我是这样做的(错误示范)
let obj = {a:1,b:2,c:3,id:x}
let param = [{a:1,b:2,c:3,id:1},{a:1,b:2,c:3,id:2}]
for(let i = 0;i<3;i++) {
param.push(obj)
}
for(let i = 0;i<param.length;i++) {
param[i].id = i+1
}
console.log(param)
按理说他最后打印的结果应该是
[{a:1,b:2,c:3,id:1},
{a:1,b:2,c:3,id:2},
{a:1,b:2,c:3,id:3},
{a:1,b:2,c:3,id:4},
{a:1,b:2,c:3,id:5}]
可是最后的结果却是打印出来的:
[{a:1,b:2,c:3,id:1},
{a:1,b:2,c:3,id:2},
{a:1,b:2,c:3,id:5},
{a:1,b:2,c:3,id:5},
{a:1,b:2,c:3,id:5}]
二、原因
答案是上文的param.push(obj),是把obj的地址给push到了param中。所以出现了,改一个,其他的也跟着改的现象。
解决方法
let obj = {a:1,b:2,c:3,id:x}
let param = [{a:1,b:2,c:3,id:1},{a:1,b:2,c:3,id:2}]
for(let i = 0;i<3;i++) {
param.push(JSON.parse(JSON.stringify(obj)))
}
for(let i = 0;i<param.length;i++) {
param[i].id = i+1
}
console.log(param)
打印结果
[{a:1,b:2,c:3,id:1},
{a:1,b:2,c:3,id:2},
{a:1,b:2,c:3,id:3},
{a:1,b:2,c:3,id:4},
{a:1,b:2,c:3,id:5}]
总结
采用深拷贝的方法,可以避免数组/对象反复使用所造成的同步修改现象。