JQuery массив целых чисел (год) создает неопределенные строки - PullRequest
1 голос
/ 01 октября 2019

У меня есть источник JSON, заполненный данными базы данных, которые я просто хочу реорганизовать. Первыми данными должен быть «Год» (2018, 2019, 2020 ...), который будет содержать подданные.

Таким образом, я построил новый массив данных, получающий данные json (в примере «источник»)).

Но когда я наконец регистрирую новый массив (_data), я получаю массив с почти полностью пустыми данными ...

... как:

Array(2020) [ undefined, undefined, undefined...]

Вглядываясь в это, я вижу, что год 2018 и 2019 (реальные данные) заполнены правильно, а все остальные годы 0 (!) - 2017 полностью пусты.

Почему _data показывает так много неиспользуемых и беспомощных данных?

Вот код

var hierarchicalData = function() {
    var _data = [];
    this.setup = function(source) {
        $.each(source, function(index, value) {
            var year = value.YEAR;
            if (typeof(_data[year]) === 'undefined') {
                console.log("Create year " + year);
                _data[year] = [];
            }
            // [... full other code generating subdata depending on year ...]
            var xxx = value.XXX;
            if (typeof(_data[year][xxx]) === 'undefined') {
                console.log("  Creation xxx (" + year + ', ' + xxx + ")");
                _data[year][xxx] = [];
            // ... and few others subdata
        }

        });
        console.log(_data);
    }
}

[Правка запуска] Вызов функции

newData = new hierarchicalData();
newData.setup(fullData.Extraction());

, где

fullData.Extraction()

- исходные данные json.

[Изменить конец]

Спасибо.

Ответы [ 2 ]

1 голос
/ 01 октября 2019

То, как работают массивы javascript, индекс значения определяется тем, сколько значений предшествует ему. Таким образом, если вы объявите значение типа arr[2018] = 'something', перед ним будет добавлено 2018 пустых значений. Вместо этого используйте объект, который будет хранить как пары ключ: значение без необходимости добавлять пустые значения.

let arr = [];
arr[2018] = 'something';
console.log('arr.length:', arr.length)

let obj = {};
obj[2018] = 'something';
console.log('entire obj:', obj)
console.log('number of obj keys:', Object.keys(obj).length)
0 голосов
/ 01 октября 2019

Поскольку индексы массива, которые вы используете, начинаются около 2018 года, как только вы назначите _data[2018], он создаст массив, содержащий 2019 элементов, и все элементы от 0 до 2017 будутUnassigned. Это потому, что индексы массива всегда начинаются с 0, поэтому во всех этих более ранних индексах что-то нужно.

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

В Chrome консоль будет сокращать его:

(2019) [empty x 2018, [some data]]

ЕслиВы не хотите видеть все эти неиспользуемые записи, используйте объект вместо массива для _data:

var _data = {};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...