有没有办法在javascript中复制对象数组?
这可能是由于我对javascript的不熟练造成的,因为我对该语言还不熟悉,但到目前为止,我还没有找到一个有效的解决方案 问题是,我想创建一个对象数组的副本数组,然后在不更改初始数组中对象的值的情况下更改副本数组中的数据,最后再次将副本数组指定给初始数组,这样我就可以在另一个具有初始值的函数中再次使用它 我制作了一个简单的程序,包含两个类-Country(包含一些属性)和一个函数来更改其中一个属性,World(包含一个国家数组)和一个函数来更改数组中所有国家的数据。我创建了一个World实例,调用changeAllCountriesData函数 最后打印countries数组和copyData数组的值。正如你所看到的,他们都改变了,我不确定原因。有没有办法在javascript中复制对象数组?,javascript,arrays,object,javascript-objects,arrayobject,Javascript,Arrays,Object,Javascript Objects,Arrayobject,这可能是由于我对javascript的不熟练造成的,因为我对该语言还不熟悉,但到目前为止,我还没有找到一个有效的解决方案 问题是,我想创建一个对象数组的副本数组,然后在不更改初始数组中对象的值的情况下更改副本数组中的数据,最后再次将副本数组指定给初始数组,这样我就可以在另一个具有初始值的函数中再次使用它 我制作了一个简单的程序,包含两个类-Country(包含一些属性)和一个函数来更改其中一个属性,World(包含一个国家数组)和一个函数来更改数组中所有国家的数据。我创建了一个World实例,调
国家级{
姓名,地区,人口,;
建造商(名称、面积、人口){
this.name=名称;
这个面积=面积;
这个。人口=人口;
}
changeData(){
this.population+=Math.round(this.population*0.02);
}
}
阶级世界{
国家=[];
copyData=[];
构造函数(){
这是loadData();
this.copyData=this.countries.slice(0);
}
loadData(){
这个.countries.push(新国家(“丹麦”,419905839809));
这个.countries.push(新国家(“德国”,34936083159604));
这个国家推动(新国家(“荷兰”,3369017342709));
}
changeAllCountriesData(){
this.copyData.forEach(c=>{
c、 changeData();
})
}
}
log(“人口的初始信息:5839809、83159604、17342709”)
w=新世界();
w、 changeAllCountriesData();
log(“国家/地区数组:”)
控制台日志(w.countries);
log(“copyData数组:”)
console.log(w.copyData)代码>在JS中,使用引用复制对象。因此,当您使用So.slice(0)
时,您部分正确,但问题是,内部值是对象。因此,新数组具有以前的值
现在您还可以尝试.map(obj=>({…obj}))
,但这不起作用,因为对象排列将创建一个具有属性但不具有方法的新对象。因此,任何方法,如changeData
,都不会出现在该对象上。因此,您必须为类创建一个复制机制
尝试更新到
cloneObject() {
const {name, area, population} = this;
return new Country(name, area, population)
}
...
this.copyData = this.countries.map( (obj) => obj.cloneObject() );
注意:您可以扩展此功能的功能。您可以添加一个参数来覆盖这些值。这将允许您一次完成多个操作:
cloneObject( overrides ) {
const { name, area, population } = { ...this, ...overrides };
return new Country(name, area, population)
}
...
this.copyData = this.countries.map( (obj) => obj.cloneObject({ name: 'Hello World' }) );
示例代码:
国家级{
姓名,地区,人口,;
建造商(名称、面积、人口){
this.name=名称;
这个面积=面积;
这个。人口=人口;
}
cloneObject(){
const{name,area,population}=这个;
返回新国家(名称、地区、人口)
}
changeData(){
this.population+=Math.round(this.population*0.02);
}
}
阶级世界{
国家=[];
copyData=[];
构造函数(){
这是loadData();
this.copyData=this.countries.map((obj)=>obj.cloneObject());
}
loadData(){
这个.countries.push(新国家(“丹麦”,419905839809));
这个.countries.push(新国家(“德国”,34936083159604));
这个国家推动(新国家(“荷兰”,3369017342709));
}
changeAllCountriesData(){
this.copyData.forEach(c=>{
c、 changeData();
})
}
}
log(“人口的初始信息:5839809、83159604、17342709”)
w=新世界();
w、 changeAllCountriesData();
log(“国家/地区数组:”)
控制台日志(w.countries);
log(“copyData数组:”)
console.log(w.copyData)代码>我正要发表评论,但无法发表,因为我还没有足够的观点
在changeAllCountriesData()
(在class-World
内部)中,您试图调用changeDate()
函数,该函数是class-Country内部的本地函数。我不确定class World是否可以直接访问另一个类的本地函数。将类赋给变量var
、let
或const
后,可以在类内调用函数。
例如:
const codeland=新国家(美国),123456
codeland.changeData()
现在,codeland是全局变量。现在,您可以通过类世界中的codeland变量访问changeData()函数
我不擅长JavaScript,我相信一定有更简单的方法
至于复制数组,方法#1和#3是正确的。(不确定方法2和方法4。方法5将国家/地区
连接到copyData
)返回NaN,因为在将数据从一个数组复制到另一个数组时,国家/地区和copyData都为空。因此,它是NaN(或未定义)
我希望有帮助