Значения переменных с отрицательными и большими индексами массива не сохраняются в локальном хранилище

У меня есть переменная с необычными индексами массива. Вот он: http://i.imgur.com/01nH8x5.png

Итак, я сохраняю его в локальном хранилище:

function Save(){
    var save = {
        //<...>
        MapCellData: MapCellData,
        MapCellDataE: MapCellDataE
        //<...>
    };
    localStorage.setItem("save",JSON.stringify(save));
}

window.setInterval(function(){
   Save()
}, 10000); // Autosave every 10 sec

Затем я иду в консоль Firebug и проверяю, какие элементы были сохранены, введя следующую команду:

JSON.parse(localStorage.getItem("save"));

Вот что я получаю: http://i.imgur.com/vva3mBk.png

Как видите, все значения переменных с отрицательными индексами и большими индексами стали неопределенными, а индексы от 0 до 4 сохранились корректно.

Примечание: MapCellData — это переменная, которая определяет, какое изображение будет применено к ячейке таблицы, а MapCellDataE — это переменная, которая определяет цвет фона ячейки. Обе эти переменные имеют одинаковые индексы, поэтому обе имеют одну и ту же проблему. Переменные, у которых нет таких странных индексов, сохраняются корректно.

Вот так это выглядит визуально.

Перед перезагрузкой страницы: http://i.imgur.com/B3FSu5e.png

После перезагрузки страницы: http://i.imgur.com/rhkZAa1.png


person Day-Elven    schedule 30.11.2015    source источник
comment
Что такое необычные индексы массива? В вашем коде нет массивов.   -  person Bergi    schedule 01.12.2015
comment
Да, JSON.stringify только сериализует индексы массива для Array объектов и отбрасывает все остальные свойства. Решение тривиально: не используйте массивы, если вы должны не используйте их.   -  person Bergi    schedule 01.12.2015
comment
Индексы показаны на первой картинке (Firebug DOM). Это индексы с отрицательными числами и индексы с очень большими числами.   -  person Day-Elven    schedule 01.12.2015
comment
По определению индексы массива положительны целые числа.   -  person Bergi    schedule 01.12.2015
comment
Однако все работало нормально, прежде чем я попытался сохранить переменную в локальном хранилище. Также это не объясняет, почему индексы больших массивов тоже не сохраняются.   -  person Day-Elven    schedule 01.12.2015
comment
Это не имеет ничего общего с локальным хранилищем, оно JSON.stringify удаляет их.   -  person Bergi    schedule 01.12.2015
comment
Кстати, почему у вас вообще отрицательные числа? Могут быть намного лучшие альтернативы.   -  person Bergi    schedule 01.12.2015


Ответы (1)


Да, JSON.stringify только сериализует < em>индексирует массив1 по Array объектам и отбрасывает все остальные свойства. Решение тривиальное — не используйте массивы, когда вам не следует не использовать их:

var MapCellData = {}; // instead of []
MapCellData[weirdProperty] = …;

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

1: §6.1.7, §9.4 .2: индекс массива — это ключ свойства со строковым значением, который является канонической числовой строкой, числовое значение которого i находится в диапазоне +0 ≤ i ‹ 232−1.

person Bergi    schedule 01.12.2015
comment
Спасибо, это решение идеально. Я и не подозревал, что существует такая удобная подстановка массивов. - person Day-Elven; 01.12.2015