Странное отображение массива объектов в виде строки в 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 шт):
Такое происходит из-за того что вы делаете 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]
Вы путаете массивы [....] и объекты {....}
В массивах числовые ключи идут подряд и начинаются с нуля. Следовательно, если вы присваиваете элемент с индексом 1, в массиве неявно выделяется пустой элемент с индексом 0.
Если вы хотите использовать произвольные индексы, то нужно создавать не массив, а объект и работать как с объектом.
Добавьте в начале
this.trainingsTime = {};
тогда все последующие записи вида this.trainingsTime[...] будут создавать поля объекта, а не элементы массива.
