Странное отображение массива объектов в виде строки в javascript

Имею очень странное отображение массива объектов.

Массив выглядит примерно так:

введите сюда описание изображения

После использования JSON.stringify() он становится таким:

[null,[[1,"01:00 - 01:45"],[2,"02:00 - 02:45"],[3,"03:00 - 03:45"]], null, null, [[1,"01:00 - 01:45"],[2,"02:00 - 02:45"],[3,"03:00 - 03:45"]]]

Хотя по идее должен:

["1":{[1,"01:00 - 01:45"],[2,"02:00 - 02:45"],[3,"03:00 - 03:45"]}, "3":{[1,"01:00 - 01:45"],[2,"02:00 - 02:45"],[3,"03:00 - 03:45"]}]

Код:

trainingsTime = {};
public addTrainingTime(time: number) {
if (typeof this.trainingsTime[this.trainingDay] === 'undefined') {
  this.trainingsTime[this.trainingDay] = [this.trainingList[time]];
} else {
  if (this.trainingsTime[this.trainingDay].indexOf(this.trainingList[time]) !== -1) {
    const index = this.trainingsTime[this.trainingDay].indexOf(this.trainingList[time]);
    this.trainingsTime[this.trainingDay].splice(index, 1);
    if (this.trainingsTime[this.trainingDay].length === 0) delete this.trainingsTime[this.trainingDay];
  } else {
    this.trainingsTime[this.trainingDay].push(this.trainingList[time]);
  }
}
}

Тип переменной: this.trainingDay - строка


Ответы (2 шт):

Автор решения: Ein

Такое происходит из-за того что вы делаете delete на элементе массива что удаляет само значение, но не изменяет размер массива и как следствие оставляет "дырку", которая в итоге даёт null.

Пример:

var arr = [1,2,3,4];

delete arr[1];

console.log(JSON.stringify(arr)); // [1,null,3,4]

Что бы убрать элемент испольуйте splice:

var arr = [1,2,3,4];

arr.splice(1,1);

console.log(JSON.stringify(arr)); // [1,3,4]

Так же ошибка происходит из-за того что вы назначаете значения напрямую интексам что так же оставляет "дырки".

var arr = [1,2,3,4];

arr[7] = 8;

console.log(JSON.stringify(arr)); // [1,2,3,4,null,null,null,8]
→ Ссылка
Автор решения: AterLux

Вы путаете массивы [....] и объекты {....}

В массивах числовые ключи идут подряд и начинаются с нуля. Следовательно, если вы присваиваете элемент с индексом 1, в массиве неявно выделяется пустой элемент с индексом 0.

Если вы хотите использовать произвольные индексы, то нужно создавать не массив, а объект и работать как с объектом.

Добавьте в начале

this.trainingsTime = {};

тогда все последующие записи вида this.trainingsTime[...] будут создавать поля объекта, а не элементы массива.

→ Ссылка