Javascript изменение значений массива без уведомления - PullRequest
2 голосов
/ 22 апреля 2020

Я новичок в Javascript, и поэтому эти проблемы могут быть чем-то простым, но я не могу найти ответ.

У меня есть класс Country с несколькими параметрами (например, имя, площадь, ppm и т. Д.). c.), А также функция updateCurrentData (input1, input2), которая изменяет текущие значения на новые в зависимости от входных данных. Затем у меня есть класс PPM_Data, который имеет эту функцию:

  initialCountries = [];
  copyData = [];

  PPMPerCountryPerYear(year, inputPopulation, inputDeforestation) {
    var result = [];
    this.copyData = this.initialCountries.slice(0);
    console.log(this.copyData);
    console.log(this.initialCountries);

    result.push({2020: this.initialCountries});
    for (let index = 2021; index <= year; index++) {

        this.copyData.forEach(c => {
            c.updateCurrentData(inputPopulation, inputDeforestation);
        })

        let yearData = [];

        this.copyData.forEach(c => {
            yearData.push(c);
        });

        result.push({ [index]: yearData });

    }

    return result;
}

Результат должен возвращать массив со значениями каждой страны по годам, например:

{ 2020: Array(12) },
{ 2021: Array(12) }
...

, где массив содержит каждый данные страны за этот год (предположим, что есть 12 стран). Значения должны немного меняться с каждым годом, что, как мне кажется, происходит, потому что я получаю массив со всеми годами, но массив тот же, и он равен последнему вычислению l oop.

Я загружаю initialCountries стран из CSV-файла с использованием d3:

loadCountries(path) {
    var self = this;
    var readCsv = d3.csv(path, function (data) {
        var country = new Country(data.name, Number(data.area), Number(data.ppm), Number(data.population), Number(data.population_growth), Number(data.forests_percentage), Number(data.forests_growth));
        self.initialCountries.push(country);
    });

    return readCsv;
}

Функция loadCountries вызывается в функции componentWillMount () в приложении. js.

Когда я нажимаю кнопку I, вызовите функцию PPMPerCountryPerYear и, как вы можете видеть, я console.log initialCountries в начале, ДО вызова функции для l oop. Кроме того, я не вызываю ЛЮБОЕ изменение в массиве initialCountries, но выводом журнала консоли являются последние обновленные значения, даже если for l oop даже не запущен. У меня вопрос: почему это происходит и как я могу предотвратить изменение массива initialCountries?

1 Ответ

0 голосов
/ 22 апреля 2020

Я думаю, что "Передано по ссылке" природы Javascript - вот что доставляет вам неприятности.

Это означает, что в JS, если вы работаете с более крупными вещами, такими как объекты {}, массивы [ ] если вы создаете один на основе другого, например

var a = {a: 'a'}
var b = a

a.a='x'

console.log(a.a) // x
console.log(b.a) // x

, я рекомендую вам поместить некоторые операторы отладчика, поскольку они более надежны, чем операторы консоли, и вы будете удивлены другими результатами

...