有没有办法在javascript中复制对象数组?

有没有办法在javascript中复制对象数组?,javascript,arrays,object,javascript-objects,arrayobject,Javascript,Arrays,Object,Javascript Objects,Arrayobject,这可能是由于我对javascript的不熟练造成的,因为我对该语言还不熟悉,但到目前为止,我还没有找到一个有效的解决方案 问题是,我想创建一个对象数组的副本数组,然后在不更改初始数组中对象的值的情况下更改副本数组中的数据,最后再次将副本数组指定给初始数组,这样我就可以在另一个具有初始值的函数中再次使用它 我制作了一个简单的程序,包含两个类-Country(包含一些属性)和一个函数来更改其中一个属性,World(包含一个国家数组)和一个函数来更改数组中所有国家的数据。我创建了一个World实例,调

这可能是由于我对javascript的不熟练造成的,因为我对该语言还不熟悉,但到目前为止,我还没有找到一个有效的解决方案

问题是,我想创建一个对象数组的副本数组,然后在不更改初始数组中对象的值的情况下更改副本数组中的数据,最后再次将副本数组指定给初始数组,这样我就可以在另一个具有初始值的函数中再次使用它

我制作了一个简单的程序,包含两个类-Country(包含一些属性)和一个函数来更改其中一个属性,World(包含一个国家数组)和一个函数来更改数组中所有国家的数据。我创建了一个World实例,调用changeAllCountriesData函数 最后打印countries数组和copyData数组的值。正如你所看到的,他们都改变了,我不确定原因。
国家级{
姓名,地区,人口,;
建造商(名称、面积、人口){
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(或未定义)

    我希望有帮助