2012-05-16 2 views
4

Мне нужно сохранить объект в localStorage - и я знаю, что для этого мне нужно преобразовать объект в строку. Все круто.LocalStorage, JavaScript и объекты

Моя проблема заключается в том, чтобы создать объект в первую очередь: у меня есть два значения в sessionStorage, которые необходимо добавить к объекту, который затем передается в localStorage. Однако, когда я пытаюсь создать объект, одно значение хранится как имя переменной, а не его (числовое) значение. Любая идея, что здесь происходит?

var siteName = sessionStorage['1']; 
var siteID = (+sessionStorage['2']); 
var temp = {siteID:siteName}; 
alert(typeof siteID); 
alert(JSON.stringify(temp)); 

Первое предупреждение подтверждает, что siteID действительно типа номера, но второе предупреждение показывает, что имя переменного (siteID) сохраняется, а не его числовое значения.

ответ

4

Эта линия:

var temp = {siteID:siteName}; 

... создает объект, содержащее свойство siteId со значением, взятым из переменной siteName.

Если вы хотите, чтобы имя свойства, чтобы быть взяты из siteID переменной вместо:

var temp = {}; 
temp[siteID] = siteName; 

Или в ES2015 (ака «ES6») вы могли бы использовать новый вычислен имя свойства синтаксис:

// ES2015+ only! 
var temp = {[siteId]: siteName}; 

В JavaScript вы можете создавать и создавать объекты на объектах двумя разными, но равными способами: с использованием точечной нотации с литеральным именем свойства:

obj.foo = "bar"; // Creates a `foo` property on `obj` with the value `"bar"` 

... или используя квадратные скобки обозначения и строку:

obj["foo"] = "bar"; // Does the same thing 

ключей в инициализаторах объектов, как ваш var temp = {siteID:siteName}; всегда используется в буквальном смысле (хотя они могут необязательно быть в кавычках); нет никакого способа, чтобы инициализатор объекта имел вместо этого ключ, взятый из переменной. Поэтому вам нужно сделать это как двухэтапный процесс, сначала создать объект, а затем установить свойство.

Так что, если вы

temp[siteID] = siteName; 

... число в siteID будет преобразовано в строку и будет именем свойства, со значением siteName является значением.

var temp = {}; 
var key = 1; 
temp[key] = "value"; 
console.log(temp[1]); // "value" 
console.log(temp["1"]); // "value" 

(Имена свойств всегда строятся в JavaScript [на данный момент].)

+1

Пятно на, спасибо! – Squishy

+0

@Squishy: Добро пожаловать, рад, что помог. –

+0

Также спасибо за объяснение (сначала увидели вашу версию с предустановленной версией;)) - четко объяснил, что 3 бесполезных учебника не смогли! – Squishy

2

Измените это на это.

var temp = {}; 

temp[siteName] = siteID; 

Или, если тест typeof был показать имя свойства, вы бы сторнировать их.

var temp = {}; 

temp[siteID] = siteName; 

Но следует помнить, что siteID считается строкой из этой точки вперед.

+1

Я думаю, что у вас есть ключ/значение назад – Mathletics

+0

@Mathletics: Да, вы правы. Я был смущен тестом 'typeof', думая, что это должно быть ценностью. Я обновлю. Спасибо за подсказку. –

+1

Отлично, спасибо! – Squishy

Смежные вопросы