Это может быть проблема, вызванная моей некомпетентностью в javascript, так как я плохо знаком с языком, но до сих пор не нашел рабочего решения.
Проблема в том, что я хочу сделать скопировать массив массива объектов, затем изменить данные в копировать массив , не меняя значений объектов в исходном массиве, и, наконец, снова назначить массив копирования исходному массиву, чтобы я мог использовать его снова в другой функции с начальными значениями.
Я сделал простую программу, содержащую два класса - Страна, которая содержит некоторые свойства и функцию для изменения одного из этих свойств, и Мир, который содержит массив стран и функцию для изменить данные всех стран в массиве. Я создаю экземпляр World, вызываю функцию changeAllCountriesData и в конце печатаю значения как массива стран, так и массива copyData. Как вы можете видеть, они оба изменились, и я не знаю, почему.
class Country{
name; area; population;
constructor(name, area, population){
this.name = name;
this.area = area;
this.population = population;
}
changeData(){
this.population += Math.round(this.population * 0.02);
}
}
class World{
countries = [];
copyData = [];
constructor(){
this.loadData();
this.copyData = this.countries.slice(0);
}
loadData(){
this.countries.push(new Country("Denmark", 41990, 5839809));
this.countries.push(new Country("Germany", 349360, 83159604));
this.countries.push(new Country("Netherlands", 33690, 17342709));
}
changeAllCountriesData(){
this.copyData.forEach(c => {
c.changeData();
})
}
}
console.log("Initial information for the population: 5839809, 83159604, 17342709")
w = new World();
w.changeAllCountriesData();
console.log("countries array:")
console.log(w.countries);
console.log("copyData array:")
console.log(w.copyData);
Другие способы, которые я пробовал вместо this.copyData = this.countries.slice (0):
1.
this.copyData = [...this.countries]
2.
this.copyArray = Array.from(this.countries);
this.copyData = copyArray[0];
3.
this.countries.forEach(c => {
this.copyData.push({...c});
})
Приведенный выше код возвращает NaN после каждого вычисления.
4.
this.countries.forEach(c => {
let obj = Object.assign({}, c);
this.copyData.push(obj);
})
5.
this.copyData = this.countries.concat();
Ни один из этих методов не создал массив копий таким образом, чтобы исходный массив оставался неизменным или вычисления выполнялись без возврата NaN.