Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:切片和追加键值后重复数组不正确_Javascript_Arrays - Fatal编程技术网

Javascript:切片和追加键值后重复数组不正确

Javascript:切片和追加键值后重复数组不正确,javascript,arrays,Javascript,Arrays,我很难弄清楚为什么persons数组包含新的agekey:value对。 我认为通过切片(并因此创建一个独立副本),我可以只处理newArray,并且只向它添加age。。。但它似乎也在更新人员 提前谢谢 const persons=[ {第一个:“阿尔伯特”,最后一个:“爱因斯坦”,出生年份:1879年,死亡年份:1955年}, {第一个:“艾萨克”,最后一个:“牛顿”,出生年份:1643年,死亡年份:1727年}, {第一个:“伽利略”,最后一个:“伽利略”,出生年份:1564,死亡年份:1

我很难弄清楚为什么
persons
数组包含新的
age
key:value对。
我认为通过切片(并因此创建一个独立副本),我可以只处理
newArray
,并且只向它添加
age
。。。但它似乎也在更新
人员

提前谢谢

const persons=[
{第一个:“阿尔伯特”,最后一个:“爱因斯坦”,出生年份:1879年,死亡年份:1955年},
{第一个:“艾萨克”,最后一个:“牛顿”,出生年份:1643年,死亡年份:1727年},
{第一个:“伽利略”,最后一个:“伽利略”,出生年份:1564,死亡年份:1642},
];
功能附件(原始阵列){
var newArray=originalArray.slice(0);
newArray.forEach(项=>{
item['age']=item.deathYear-item.birthYear;
})
返回新数组
}
控制台信息(人)
var newPersons=附件(人)

console.info(newPersons)
slice
执行浅层复制,这意味着它只复制顶级值,包括引用,而不实际复制引用的值本身

这意味着两个数组中的每个person对象都是同一个对象

一个简单的解决方案是为person对象创建一个自定义复制函数,并将其与
map
一起用于复制数组

const people=[
{第一个:“阿尔伯特”,最后一个:“爱因斯坦”,出生年份:1879年,死亡年份:1955年},
{第一个:“艾萨克”,最后一个:“牛顿”,出生年份:1643年,死亡年份:1727年},
{第一个:“伽利略”,最后一个:“伽利略”,出生年份:1564,死亡年份:1642},
];
功能复制人(人){
返回Object.assign({},person);
}
功能copyPeople(人){
返回人物。地图(复制人);
}
功能附件(人){
const newArray=copyPeople(人);
newArray.forEach(项=>{
item['age']=item.deathYear-item.birthYear;
});
返回新数组;
}
console.info('------------------------------------------------');
控制台信息(“老年人”);
console.log(人)
console.info('------------------------------------------------');
console.info(“新人”);

控制台日志(附件(人))
slice
执行浅层复制,这意味着它只复制顶级值,包括引用,而不实际复制引用的值本身

这意味着两个数组中的每个person对象都是同一个对象

一个简单的解决方案是为person对象创建一个自定义复制函数,并将其与
map
一起用于复制数组

const people=[
{第一个:“阿尔伯特”,最后一个:“爱因斯坦”,出生年份:1879年,死亡年份:1955年},
{第一个:“艾萨克”,最后一个:“牛顿”,出生年份:1643年,死亡年份:1727年},
{第一个:“伽利略”,最后一个:“伽利略”,出生年份:1564,死亡年份:1642},
];
功能复制人(人){
返回Object.assign({},person);
}
功能copyPeople(人){
返回人物。地图(复制人);
}
功能附件(人){
const newArray=copyPeople(人);
newArray.forEach(项=>{
item['age']=item.deathYear-item.birthYear;
});
返回新数组;
}
console.info('------------------------------------------------');
控制台信息(“老年人”);
console.log(人)
console.info('------------------------------------------------');
console.info(“新人”);

控制台日志(附件(人))
您已经创建了
persons
数组的副本,其中包含对原始对象的引用,而不是这些对象的副本。要创建完整副本,还需要克隆对象

请注意,
Object#assign
只会复制对象的顶级属性,因此您需要复制对象

const persons=[
{第一个:“阿尔伯特”,最后一个:“爱因斯坦”,出生年份:1879年,死亡年份:1955年},
{第一个:“艾萨克”,最后一个:“牛顿”,出生年份:1643年,死亡年份:1727年},
{第一个:“伽利略”,最后一个:“伽利略”,出生年份:1564,死亡年份:1642},
];
功能附件(原始阵列){
返回originalArray.map((item)=>Object.assign({},item{
年龄:item.deathYear-item.birthYear
}));
}
var newPersons=附件(人);
控制台信息(新人);

控制台信息(个人);//persons未更改
您创建了
persons
数组的副本,该数组包含对原始对象的引用,而不是这些对象的副本。要创建完整副本,还需要克隆对象

请注意,
Object#assign
只会复制对象的顶级属性,因此您需要复制对象

const persons=[
{第一个:“阿尔伯特”,最后一个:“爱因斯坦”,出生年份:1879年,死亡年份:1955年},
{第一个:“艾萨克”,最后一个:“牛顿”,出生年份:1643年,死亡年份:1727年},
{第一个:“伽利略”,最后一个:“伽利略”,出生年份:1564,死亡年份:1642},
];
功能附件(原始阵列){
返回originalArray.map((item)=>Object.assign({},item{
年龄:item.deathYear-item.birthYear
}));
}
var newPersons=附件(人);
控制台信息(新人);

控制台信息(个人);//persons没有改变你的。forEach循环实际上是在更新数组,而不是片。切片正在复制,但当您传递它时,它进入forEach循环。因此,当您将项目添加到您认为是副本的内容时,您将添加到原始内容

您的.forEach循环实际上是在更新数组,而不是片。切片正在复制,但当您传递它时,它进入forEach循环。因此,当您将项目添加到您认为是副本的内容时,您将添加到原始内容

如果同时调用
.map()
,则无需使用
.slice()
,因为
.map()
会创建一个新数组。太棒了。。。谢谢你的快速回复。。。我读过一些关于浅拷贝和深拷贝的文章,但并没有真正理解它。。。此解决方案非常完美。@sigmazen很乐意帮忙:)如果是y,则无需使用
.slice()