Получение нежелательных данных из localStorage с помощью нескольких браузеров

У меня есть ключ и значение одной пары, хранящиеся в localStorage. Я хочу поместить все записи, хранящиеся там в массив:

function fillRecordArray(){
    recordArr.splice(0,recordArr.length);
    for(var i in localStorage) 
    {
        var record = new Record(i,localStorage[i]);
        recordArr.push(record);
    }   
}

Который работает отлично, пока я не перестал использовать Chrome и не протестировал его на Mozilla. В этом случае, помимо сохраненных данных, я также получаю 6 дополнительных элементов массива с этими значениями:

1
function key() { [native code] }
function getItem() { [native code] }
function setItem() { [native code] }
function removeItem() { [native code] }
function clear() { [native code] }

Что может вызвать эту проблему и есть ли какой-либо способ избежать ее, кроме как просто удалить ее из массива?

Заранее спасибо.

4 ответа

  1. Firefox предоставляет вам объект api хранения: https://developer.mozilla.org/en-US/docs/Web/API/Storage . Это по замыслу, поэтому я не думаю, что есть способ избежать этого.

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

    Что интересно, Chrome также реализует WebAPI. Если Chrome не возвращает эти функции, то вы можете проверить, как вы получаете/доступ/передачу «запись». Что-то может менять свой тип.

  2. Используйте цикл for для итерации по длинеlocalStorage, а не цикл for in.

    for(var i=0; i<localStorage.length; i++){
        var record = new Record(i, localStorage.getItem(localStorage.key(i)));
        recordArr.push(record);
    }
    

    Однако я предпочел бы хранить записи в одном контейнере в localStorage, а не иметь их в качестве корневых ключей.

    Например:

    // store the array
    localStorage.setItem('records', JSON.stringify(recordsArr);
    
    // retrieve the array
    var retrievedRecords = localStorage.getItem('records');
    if(retrievedRecords){
        retrievedRecords = JSON.parse(retrievedRecords);
    } else {
        retrievedRecords = [];
    }
    
  3. Использовать Object.keys(), Array.prototype.forEach()

    var keys = Object.keys(localStorage);
    
    keys.forEach(function(key) {
      // do stuff
      console.log(localStorage[key]);
      var record = new Record(key, localStorage[key]);
      recordArr.push(record);
    })
    
  4. Это должно работать в обоих браузерах… «hasOwnProperty» отделяет ваши данные от функций

    recordArr = [];
    for(var i in localStorage)
    {
      if ( localStorage.hasOwnProperty(i) )
      {
        recordArr.push(i);
      }
    }