2010-12-17 3 views
15

Est-il possible de créer un cookie à l'aide de tableaux? Je voudrais stocker a[0]='peter', a['1']='esther', a['2']='john' dans un cookie en JavaScript.Créer un tableau dans un cookie avec javascript

+1

Étant donné la nature des tableaux, un cookie (taille limitée) est le dernier endroit où je tenterais de stocker une/la dernière méthode de stockage que j'essaierais d'utiliser. – symcbean

Répondre

7

Les cookies ne peuvent contenir que des chaînes. Si vous voulez simuler un tableau, vous devez le sérialiser et le désérialiser.

Vous pouvez le faire avec une bibliothèque JSON.

+0

J'ai juste besoin de stocker un tableau de chaînes. Est-ce possible avec une méthode plus simple? – limfreak

+1

Ceci est une méthode simple. Il existe des méthodes plus simples, mais elles ne sont que légèrement plus simples et beaucoup moins robustes. – Quentin

+0

Utilisez certainement JSON. Vous pouvez stocker "['foo', 'bar']" et l'évaluer plus tard, mais cela peut être un désastre en termes de performance et de stabilité. –

1

Créer un tableau dans un cookie à l'aide de jQUery?

var list = new cookieList("test"); $(img).one('click', function(i){ while($('.selected').length < 3) { 
    $(this).parent() 
     .addClass("selected") 
     .append(setup.config.overlay); 

    //$.cookie(setup.config.COOKIE_NAME, d, setup.config.OPTS); 
    var index = $(this).parent().index(); 

    // suppose this array go into cookies.. but failed 
    list.add(index); 

    var count = 'You have selected : <span>' + $('.selected').length + '</span> deals'; 
    if($('.total').length){ 
     $('.total').html(count); 
    } 

} }); 
1

Je suis d'accord avec les autres commentaires - vous ne devriez pas faire cela et vous devriez utiliser JSON. Cependant, pour répondre à votre question, vous pouvez le pirater en stockant le tableau sous la forme d'une chaîne délimitée par des virgules. Disons que vous vouliez économiser le suivant tableau JavaScript dans un cookie:

var a = ['peter','esther','john']; 

Vous pouvez définir une chaîne de cookie, itérer puis sur le tableau:

// Create a timestamp in the future for the cookie so it is valid 
var nowPreserve = new Date(); 
var oneYear = 365*24*60*60*1000; // one year in milliseconds 
var thenPreserve = nowPreserve.getTime() + oneYear; 
nowPreserve.setTime(thenPreserve); 
var expireTime = nowPreserve.toUTCString(); 

// Define the cookie id and default string 
var cookieId = 'arrayCookie'; 
var cookieStr = ''; 

// Loop over the array 
for(var i=0;i<a.length;i++) { 
    cookieStr += a[i]+','; 
} 

// Remove the last comma from the final string 
cookieStr = cookieStr.substr(0,cookieStr.length-1); 

// Now add the cookie 
document.cookie = cookieId+'='+cookieStr+';expires='+expireTime+';domain='+document.domain; 

Dans cet exemple, vous obtiendrez la suivant cookie stocké (si votre domaine est www.example.com):

arrayCookie=peter,ester,john;expires=1365094617464;domain=www.example.com 
+3

Je sais que c'est vieux, mais vous auriez pu faire var a = ['peter', 'esther', 'john']. Join(); Et puis retirez la boucle et la sous-chaîne. – cazgp

+0

oui ... @ cazgp ....mais bon à voir enlever "," dans le ci-dessus –

39

Comme vous pouvez le lire dans ce topic:

Vous combinez l'utilisation jQuery.cookie plugin et JSON et résolvez votre problème.

Lorsque vous souhaitez enregistrer un tableau, vous créez un tableau de JS et d'utiliser JSON.stringify pour la transformer en une chaîne et stockée avec $.cookie('name', 'array_string')

var myAry = [1, 2, 3]; 
$.cookie('name', JSON.stringify(myAry)); 

Lorsque vous voulez retrive le tableau à l'intérieur du cookie, vous utilisez $.cookie('name') pour récupérer la valeur de cookie et utilisez JSON.parse pour récupérer le tableau de la chaîne.

var storedAry = JSON.parse($.cookie('name')); 
//storedAry -> [1, 2, 3] 
1

j'ajouter le code ci-dessous Script (voir le code suivant) dans un fichier javascript appelé CookieMonster.js.

Il est un wrapper autour de l'extrait en cours de http://www.quirksmode.org/js/cookies.html

Il fonctionne avec les tableaux et les chaînes, il automagiquement échapper à votre tableau/les virgules de chaîne , et des points-virgules ; (qui ne sont pas traités dans les extraits originaux).

J'ai énuméré l'utilisation simple et l'utilisation de bonus que j'ai intégrée dedans.

Utilisation:

//set cookie with array, expires in 30 days 
var newarray = ['s1', 's2', 's3', 's4', 's5', 's6', 's7']; 
cookiemonster.set('series', newarray, 30); 

var seriesarray = cookiemonster.get('series'); //returns array with the above numbers 

//set cookie with string, expires in 30 days 
cookiemonster.set('sample', 'sample, string;.', 30); 

var messagestring = cookiemonster.get('sample'); //returns string with 'sample, string;.' 

Bonus:

//It also conveniently contains splice and append (works for string or array (single string add only)). 

//append string 
cookiemonster.append('sample', ' add this', 30); //sample cookie now reads 'sample, string;. add this' 

//append array 
cookiemonster.append('series', 's8', 30); //returns array with values ['s1', 's2', 's3', 's4', 's5', 's6', 's7', 's8'] 

//splice 
cookiemonster.splice('series', 1, 2, 30); //returns array with values ['s1', 's4', 's5', 's6', 's7', 's8'] 

CookieMonster.js:

 var cookiemonster = new Object(); 

     cookiemonster.append = function (cookieName, item, expDays) { 
      item = cm_clean(item); 
      var cookievalue = cookiemonster.get(cookieName); 
      if (cookievalue instanceof Array) { 
       cookievalue[cookievalue.length] = item; 
       cm_createCookie(cookieName, cm_arrayAsString(cookievalue), expDays); 
      } else { 
       cm_createCookie(cookieName, cookievalue + item, expDays); 
      } 
     }; 

     cookiemonster.splice = function (cookieName, index, numberToRemove, expDays) { 
      var cookievalue = cookiemonster.get(cookieName); 
      if (cookievalue instanceof Array) { 
       cookievalue.splice(index, numberToRemove); 
       cm_createCookie(cookieName, cm_arrayAsString(cookievalue), expDays); 
      } 
     }; 



     cookiemonster.get = function (cookieName) { 
      var cstring = cm_readCookie(cookieName); 
      if (cstring.indexOf('<#&type=ArrayVals>') != -1) { 

       var carray = cstring.split(','); 

       for (var i = 0; i < carray.length; i++) { 
         carray[i] = cm_dirty(carray[i]); 
       } 

       if (carray[0] == '<#&type=ArrayVals>') { 
        carray.splice(0, 1); 
       } 

       return carray; 

      } else { 

       return cm_dirty(cstring); 
      } 
     }; 

     cookiemonster.set = function (cookieName, value, expDays) { 
      if (value instanceof Array) { 
       cm_createCookie(cookieName, cm_arrayAsString(value), expDays); 
      } 
      else { cm_createCookie(cookieName, cm_clean(value), expDays); } 

     }; 

     cookiemonster.eraseCookie = function (name) { 
      cm_createCookie(name, "", -1); 
     }; 

     function cm_replaceAll(str, find, replace) { 

      return str.replace(new RegExp(find, 'g'), replace); 
     }; 

     function cm_clean(ret) { 
      ret = cm_replaceAll(ret.toString(), ',', '&#44'); 
      ret = cm_replaceAll(ret.toString(), ';', '&#59'); 
      return ret; 
     }; 
     function cm_dirty(ret) { 
      ret = cm_replaceAll(ret, '&#44', ','); 
      ret = cm_replaceAll(ret, '&#59', ';'); 
      return ret; 
     }; 

     function cm_createCookie(name, value, days) { 
      if (days) { 
       var date = new Date(); 
       date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); 
       var expires = "; expires=" + date.toGMTString(); 
      } else var expires = ""; 
      document.cookie = name + "=" + value + expires + "; path=/"; 
     }; 

     function cm_readCookie(name) { 
      var nameEQ = name + "="; 
      var ca = document.cookie.split(';'); 
      for (var i = 0; i < ca.length; i++) { 
       var c = ca[i]; 
       while (c.charAt(0) == ' ') c = c.substring(1, c.length); 
       if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length); 
      } 
      return null; 
     }; 

     function cm_arrayAsString(array) { 
      var ret = "<#&type=ArrayVals>"; //escapes, tells that string is array 
      for (var i = 0; i < array.length; i++) { 
        ret = ret + "," + cm_clean(array[i]); 
      } 
      return ret; 
     }; 
0

Pour cet exemple, vous pouvez le faire assez facilement:

  • Make Cookies:

    ///W3Schools Cookie Code: 
    function setCookie(cname,cvalue,exdays) { 
        var d = new Date(); 
        d.setTime(d.getTime() + (exdays*24*60*60*1000)); 
        var expires = "expires=" + d.toGMTString(); 
        document.cookie = cname + "=" + cvalue + ";" + expires + ";"; 
    } 
    
    function getCookie(cname) { 
        var name = cname + "="; 
        var ca = document.cookie.split(';'); 
        for(var i = 0; i < ca.length; i++) { 
         var c = ca[i]; 
         while (c.charAt(0) == ' ') { 
          c = c.substring(1); 
         } 
         if (c.indexOf(name) == 0) { 
          return c.substring(name.length, c.length); 
         } 
        } 
        return ""; 
    } 
    
    ///My Own Code: 
    for(a=0;a<b.length;a++){ 
        setCookie(b[a],b[a],periodoftime); 
    } 
    
  • Récupérer tableau:

    for(a=0;a<b.length;a++){ 
        b[a] = getCookie(b[a]) 
    } 
    

Pour tout tableau avec d'autres types de valeur en plus des chaînes:

  • Make Cookies:

    ///Replace MyCode above With: 
    if(typeof b[a] === 'string'){ 
        setCookie(b[a],b[a],periodoftime); 
    }else{ 
        setCookie(b[a].toString,b[a],periodoftime); 
    } 
    
  • Récupérer tableau:

    for(a=0;a<b.length;a++){ 
        if(typeof b[a] === 'string'){ 
         b[a] = getCookie(b[a]) 
        }else{ 
         b[a] = getCookie(b[a].toString) 
        } 
    } 
    

Le seul défaut est que les valeurs identiques ne peuvent pas être récupérées.

Aucun JQuery requis, séparation des virgules ou JSON.

0

J'ai créé ce moyen facile d'obtenir des cookies. Il va donner erreur si l'exécution, mais il est fonctionnel

var arrayOfCookies = []; 
 
function parseCookieToArray() 
 
{ 
 
    var cookies  = document.cookie; 
 
    var arrayCookies = cookies.split(';'); 
 
    arrayCookies.map(function(originalValue){ 
 
     var name = originalValue.split('=')[0]; 
 
     var value = originalValue.split('=')[1]; 
 
     arrayOfCookies[name] = value; 
 
    }); 
 
} 
 
console.log(arrayOfCookies); //in my case get out: [language: 'en_US', country: 'brazil'] 
 
parseCookieToArray();

New Mes nouveaux obj createget les cookies

cookie = { 
    set: function(name, value) { 
     document.cookie = name+"="+value; 
    }, 
    get: function(name) { 
     cookies = document.cookie; 
     r = cookies.split(';').reduce(function(acc, item){ 
      let c = item.split('='); //'nome=Marcelindo' transform in Array[0] = 'nome', Array[1] = 'Marcelindo' 
      c[0] = c[0].replace(' ', ''); //remove white space from key cookie 
      acc[c[0]] = c[1]; //acc == accumulator, he accomulates all data, on ends, return to r variable 
      return acc; //here do not return to r variable, here return to accumulator 
     },[]); 
    } 
}; 
cookie.set('nome', 'Marcelindo'); 
cookie.get('nome'); 

Et excusez-moi pour mon débutant anglais .

Questions connexes