2013-05-24 3 views
1

Я новичок в javascript. Кто-нибудь, пожалуйста, покажите мне, как хранить карту в локальном хранилище. Ниже я попытался. После хранения я, похоже, не могу перебирать ключи карты. UDATE2: Это может быть функция serializeObject. Почему я использую эту функцию? В противном случае, когда я отправляю в AJAX, я получаю: Uncaught TypeError: Преобразование круговой структуры JSONКак перебирать все поля объекта

UPDATE: выглядит как ПРОБЛЕМА перед тем как оно переходит в локальном запоминающем устройстве.

var reportId = getGUID(); 

var theReports = localStorage.getItem('reports'); 
if (theReports == null) { 
    theReports = {}; 
} 

theReports[reportId] = JSON.stringify($('#reportInfo').serializeObject()); 

// HERE ALSO I AM SEEING HUNDREDS OF FIELDS. I EXPECTED JUST reportID. I AM NOT SEEING THE KEY reportId. THIS IS BEFORE IT GOES INTO LOCAL STORAGE. 

for (var prop in theReports) 
{ 
    console.log(prop); 
} 

localStorage.setItem('reports', JSON.stringify(theReports)); 
var tReports = localStorage.getItem('reports'); 

// This prints out 1,2,3,...500 for every field in #reportInfo form 
// What I was expecting is reportId1, reportId2 etc. and definitely not the id of each field of the report itself! 
for (var property in tReports) { 
    if (tReports.hasOwnProperty(property)) { 
     console.log(property); 
    } 
} 

Это функция serializeObject. Возможно, это проблема.

$(function() { 


    $.fn.serializeObject = function(){ 

    var self = this, 
    json = {}, 
    push_counters = {}, 
    patterns = { 
    "validate": /^[a-zA-Z][a-zA-Z0-9_]*(?:\[(?:\d*|[a-zA-Z0-9_]+)\])*$/, 
    "key":  /[a-zA-Z0-9_]+|(?=\[\])/g, 
    "push":  /^$/, 
    "fixed": /^\d+$/, 
    "named": /^[a-zA-Z0-9_]+$/ 
    }; 


    this.build = function(base, key, value){ 
    base[key] = value; 
    return base; 
    }; 

    this.push_counter = function(key){ 
    if(push_counters[key] === undefined){ 
    push_counters[key] = 0; 
    } 
    return push_counters[key]++; 
    }; 

    $.each($(this).serializeArray(), function(){ 

     // skip invalid keys 
     if(!patterns.validate.test(this.name)){ 
     return; 
     } 

     var k, 
     keys = this.name.match(patterns.key), 
     merge = this.value, 
     reverse_key = this.name; 

     while((k = keys.pop()) !== undefined){ 

     // adjust reverse_key 
     reverse_key = reverse_key.replace(new RegExp("\\[" + k + "\\]$"), ''); 

     // push 
     if(k.match(patterns.push)){ 
     merge = self.build([], self.push_counter(reverse_key), merge); 
     } 

     // fixed 
     else if(k.match(patterns.fixed)){ 
     merge = self.build([], k, merge); 
     } 

     // named 
     else if(k.match(patterns.named)){ 
     merge = self.build({}, k, merge); 
     } 
     } 

     json = $.extend(true, json, merge); 
     }); 

    return json; 
    }; 
+0

Не могли бы вы опубликовать весь 'tReports'? – bfavaretto

+0

В основном я сохраняю форму нескольких полей отчета. tRepports должен указывать на те регистры, которые были сохранены в localStorage. – MoreQuestionsThanAnswers

+0

после установки репортажей [reportId] = xyz, я думал, что повторение реестров даст мне свойство = reportId. – MoreQuestionsThanAnswers

ответ

1
var tReports = localStorage.getItem('reports'); 

Переменная tReports Теперь держит строковой версии отчетов объекта.


localStorage и sessionStorage хранить только пару ключ/значение в виде строки.

Так что если вы не хотите хранить объект, вам необходимо его сериализовать в строку.

localStorage.setItem('key', JSON.stringify(myObject)); 

Если вы не хотите его извлекать из хранилища, вам необходимо сначала десериализовать его, прежде чем вы сможете его использовать.

var myObject = JSON.parse(localStorage.getItem('key')); 

https://developer.mozilla.org/en-US/docs/Web/Guide/DOM/Storage?redirectlocale=en-US&redirectslug=DOM%2FStorage

+0

См. Мое обновление. Я вижу сотни ключей, имена перед хранением в локальном хранилище. – MoreQuestionsThanAnswers

+0

Я обновил метод serializeObject. Возможно, это вызывает проблему. – MoreQuestionsThanAnswers

+0

Я использую этот метод, потому что в противном случае я получаю: Uncaught TypeError: Преобразование круговой структуры в JSON – MoreQuestionsThanAnswers

1

Вместо:

console.log(property); 

Do:

console.log(tReports[property]); 

Поскольку переменная property является фактическое имя свойства, а не его значение.

+0

Проблема заключается в том, что я вижу сотни полей для свойства. Это верно до и после локального хранилища. Кажется, что я вижу свойство для всего, что находится справа от tReports [property] – MoreQuestionsThanAnswers

+0

Я использовал метод serializeObject для отправки сообщения в $ ajax-вызове. – MoreQuestionsThanAnswers

2

Цикл for..in дает вам только ключи, а не сами элементы. Вы получаете детали с tReports[property]

var obj = { 
    "1": "one", 
    "2": "two", 
    "3": "three" 
}; 

for (var key in obj) { 
    console.log(key); //1, 2, 3 
    console.log(obj[key]); //one, two, three 
} 
+0

Я не вижу ключа. – MoreQuestionsThanAnswers

+0

Ну ваша строка 'console.log (свойство);' определенно печатает ключи (имена свойств) или индексы (для массивов) вашего объекта 'tReports'. Но я не знаю, что находится внутри 'tReports'.Основываясь на том, что вы написали, оказалось, что вы печатаете индексы массива, когда вы действительно хотите распечатать элементы этого массива. – basilikum

+0

@MoreQuestionsThanAnswers обычно, когда люди говорят «ключ» в этом контексте, они ссылаются на имена свойств. Когда у вас есть строка, такая как 'obj [foo] = bar',' obj' - это hashmap, где 'foo' является' key' и 'bar' является' value'. – Renan

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