2013-04-18 16 views
23

Ho una funzione in Javascript:spinta JSON oggetti di matrice in localStorage

var a = []; 
function SaveDataToLocalStorage(data) 
{  
    var receiveddata = JSON.stringify(data); 
    a.push(receiveddata); 
    alert(a); 

    localStorage.setItem('session', a); 

} 

il parametro di dati è un oggetto JSON.

Ma ogni volta che faccio clic sul pulsante, sovrascrive i dati nella mia localstorage.

Qualcuno sa come fare?

+1

Tenta di usare 'window.a = []; 'e quindi spingere in questo modo; 'Window.a.push (receiveddata)'. O semplicemente memorizzalo una volta in una nuova "a" all'inizio della funzione. –

+0

sovrascrive ancora – nielsv

+0

Lo stai facendo anche sull'ingresso effettivo? 'localStorage.setItem ('session', window.a);' –

risposta

56

Ci sono alcuni passaggi che è necessario prendere per memorizzare correttamente queste informazioni nel vostro localStorage. Prima di arrivare al codice, tuttavia, tieni presente che localStorage (al momento attuale) non può contenere nessun tipo di dati tranne stringhe. Sarà necessario serializzare la matrice per la memorizzazione e quindi analizzarla per apportare modifiche.

Fase 1:

Il codice Primo frammento di seguito deve essere eseguito solo se non si è già memorizzando una matrice serializzato nella variabile localStorage session.
Per garantire la vostra localStorage è configurato correttamente e memorizzare una matrice, eseguire il seguente frammento di codice prima:

var a = []; 
a.push(JSON.parse(localStorage.getItem('session'))); 
localStorage.setItem('session', JSON.stringify(a)); 

Il codice di cui sopra deve essere eseguito solo volta e solo se non si è già memorizzando una matrice nella variabile locale session. Se si sta già facendo questo passare al punto 2.

Fase 2:

Modificare la funzione in questo modo:

function SaveDataToLocalStorage(data) 
{ 
    var a = []; 
    // Parse the serialized data back into an aray of objects 
    a = JSON.parse(localStorage.getItem('session')); 
    // Push the new data (whether it be an object or anything else) onto the array 
    a.push(data); 
    // Alert the array value 
    alert(a); // Should be something like [Object array] 
    // Re-serialize the array back into a string and store it in localStorage 
    localStorage.setItem('session', JSON.stringify(a)); 
} 

Questo dovrebbe prendersi cura di tutto il resto per voi. Quando lo analizzi, diventerà una serie di oggetti.

Spero che questo aiuti.

+0

Sei il migliore! Grazie! – nielsv

+0

@ user1775531 Nessun problema amico! Felice di aiutare. Buona fortuna e buona programmazione! :) – War10ck

+0

Grazie. Sai come posso estrarlo dallo store locale come array separati? – nielsv

8

A partire da ora, è possibile memorizzare solo valori stringa in localStorage. È necessario serializzare l'oggetto array e quindi memorizzarlo in localStorage.

Ad esempio:

localStorage.setItem('session', a.join('|')); 

o

localStorage.setItem('session', JSON.stringify(a)); 
-1
var arr = [ 'a', 'b', 'c']; 
arr.push('d'); // insert as last item 
5

Mettere un intero array in una voce localStorage è molto inefficiente: il tutto ha bisogno di essere ri-codificato ogni volta che si aggiunge qualcosa alla matrice o modificare una voce.

Un'alternativa è utilizzare http://rhaboo.org che memorizza qualsiasi oggetto JS, tuttavia profondamente annidato, utilizzando una voce localStorage separata per ciascun valore del terminale.Gli array vengono ripristinati molto più fedelmente, incluse le proprietà non numerici e vari tipi di scarsità, prototipi di oggetti/costruttori vengono ripristinati nei casi standard e l'API è ridicolmente semplice:

var store = Rhaboo.persistent('Some name'); 
store.write('count', store.count ? store.count+1 : 1); 

store.write('somethingfancy', { 
    one: ['man', 'went'], 
    2: 'mow', 
    went: [ 2, { mow: ['a', 'meadow' ] }, {} ] 
}); 
store.somethingfancy.went[1].mow.write(1, 'lawn'); 

A proposito, ho scritto.

+0

È una grande biblioteca! Grazie! –

2

Una cosa che posso suggerire è di estendere l'oggetto di archiviazione per gestire oggetti e matrici.

LocalStorage in grado di gestire solo le stringhe in modo da poter ottenere che l'utilizzo di questi metodi

Storage.prototype.setObj = function(key, obj) { 
    return this.setItem(key, JSON.stringify(obj)) 
} 
Storage.prototype.getObj = function(key) { 
    return JSON.parse(this.getItem(key)) 
} 

Usandolo ogni valori saranno convertiti in stringa JSON sul set e analizzato sul ottenere

Problemi correlati