Причина, по которой это происходит, заключается в том, что метод JSON.stringify
определен для работы в официальной спецификации EcmaScript 5.1 .
Представление массивов включает толькоэлементы от нуля до array.length - 1 включительно.Именованные свойства исключаются из строковой классификации.Массив структурируется как открытая левая скобка, элементы, разделенные запятой, и закрывающая правая скобка.
Это означает, что любые пользовательские реквизиты, которые вы добавляете к объекту, который проходит тест на Array.isArray(arr)
, будут не быть частью сериализации.Таким образом, вы можете просто добавить свойства к объекту, как вы это сделали, но они будут потеряны после сериализации, используя JSON.stringify()
.
Вы можете переопределить способ преобразования массивов (и любого объекта), используя специальный метод toJSON
для объекта массива, но вы, вероятно, не хотите этого делать, поскольку JSON.parse()
не будет знатькак сделать представление пользовательского объекта массивом снова.Пример:
a = [1,2,3]
a.toJSON = function(){ return "custom repr"; }
JSON.stringify(a) // "\"custom repr\""
Если вы действительно хотите, чтобы ваши пользовательские индексы выдерживали сериализацию / десериализацию, вам нужно другое представление, которое сохранит их.Вы можете использовать обычный объект в вашем случае просто отлично, но, конечно, вы потеряете все операции с массивами (такие как push
, pop
и т. Д.).
Я бы посоветовал вам либо хранить свои индексы на отдельном объекте, либо использовать составную структуру, подобную предложенной в другом ответе:
myObj = {
array: [],
myIndex1: ...,
myIndex2: ...
}