Невозможно сохранить массив с пользовательскими индексами в localStorage - PullRequest
0 голосов
/ 04 октября 2018

У меня есть массив объектов.Массив содержит индексы в порядке приращения и некоторые другие пользовательские индексы.Например:

var myArray = [];
myArray['userIndex1'] = 'userIndex1';
myArray['userIndex2'] = 'userIndex2';
myArray[0]{
    'name' : 'Name1',
    'id' : '114'
}
myArray[1]{
    'name' : 'Name2',
    'id' : '123'
}

Код, который я использую для установки его в localStorage:

localStorage.setItem('mySavedItem', JSON.stringify(myArray));

Проблема, с которой я сталкиваюсь, заключается в том, что при получении через:

JSON.parse(localStorage.getItem('mySavedItem'));

Это дает только

myArray[0]{
    'name' : 'Name1',
    'id' : '114'
}
myArray[1]{
    'name' : 'Name2',
    'id' : '123'
}

Как вы можете видеть, пользовательские индексы не возвращаются, или, возможно, они не были сохранены с самого начала при выполнении JSON.stringify(myArray); Так что я попытался сохранитьих в отдельный индекс.Итак, моя окончательная структура стала:

var myArray = [];
myArray['userIndex']{
    'userIndex1': 'userIndex1';
    'userIndex2': 'userIndex2';
}
myArray[0]{
    'name' : 'Name1',
    'id' : '114'
}
myArray[1]{
    'name' : 'Name2',
    'id' : '123'
}

Хотя результат все тот же.Он сохраняет / извлекает данные только с индексами 0 и 1. Пользовательский индекс отсутствует в результате.

Я могу решить эту проблему, создав все индексы только в последовательном порядке.Означает, что если я добавлю myArray['userIndex'] к дополнительному элементу как myArray['2'], тогда он сможет получить / сохранить все данные, но я не могу понять причину этого.Кто-нибудь может объяснить?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Причина, по которой это происходит, заключается в том, что метод 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: ...
}
0 голосов
/ 04 октября 2018

То, что вы пытаетесь достичь, возможно, но вам нужно написать дополнительный код для упорядочения и анализа данных.Я бы использовал объект вместо массива.«Пользовательские индексы» - это обычные свойства объекта, а исходный массив хранится как свойство массива объекта.

var myObj = {
  myArray: []
};
myObj['userIndex1'] = 'userIndex1';
myObj['userIndex2'] = 'userIndex2';
myObj.myArray.push({
   'name' : 'Name1',
   'id' : '114'
});
...
localStorage.setItem('mySavedItem', JSON.stringify(myObj));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...