Создать массив в cookie с помощью JavaScript - PullRequest
20 голосов
/ 17 декабря 2010

Можно ли создать cookie с использованием массивов?

Я хотел бы сохранить a[0]='peter', a['1']='esther', a['2']='john' в файле cookie в JavaScript.

Ответы [ 7 ]

47 голосов
/ 05 июня 2013

Как вы можете прочитать в этой теме :

Вы комбинируете использование плагина jQuery.cookie и JSON и решаете свою проблему.

Когда вы хотите сохранить массив, вы создаете массив в JS и используете JSON.stringify, чтобы преобразовать его в строку и сохранить с помощью $.cookie('name', 'array_string')

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

Когда вы хотитеИзвлеките массив из cookie, вы используете $.cookie('name'), чтобы извлечь значение cookie, и JSON.parse, чтобы извлечь массив из строки.

var storedAry = JSON.parse($.cookie('name'));
//storedAry -> [1, 2, 3]
8 голосов
/ 17 декабря 2010

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

Это можно сделать с помощью библиотеки JSON .

3 голосов
/ 11 сентября 2014

Я добавляю код ниже Сценарий (см. Следующий код) в файл javascript с именем CookieMonster.js.

Это обертка вокруг текущего фрагмента из http://www.quirksmode.org/js/cookies.html

Работает с массивами и строками, автоматически уберет запятые вашего массива / строки , и точки с запятой ; (которые не обрабатываются в оригинальных фрагментах).

Я перечислил простое использование и некоторое дополнительное использование, которое я встроил в него.

Использование:

//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;.'

Бонусы:

//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;
        };
1 голос
/ 06 сентября 2017

Я создал этот простой способ получить куки.Он выдаст ошибку, если выполнить здесь, но он функционален

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();

Новый Мой новый объект для create get куки

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=Marcelo' transform in Array[0] = 'nome', Array[1] = 'Marcelo'
            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', 'Marcelo');
cookie.get('nome');
1 голос
/ 04 апреля 2012

Я согласен с другими комментариями - вы не должны делать это, и вы должны использовать JSON. Однако, чтобы ответить на ваш вопрос, вы можете взломать его, сохранив массив в виде строки, разделенной запятой. Допустим, вы хотите сохранить следующий массив Javascript в cookie:

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

Вы можете определить строку cookie, а затем выполнить итерацию по массиву:

// 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;

В этом примере вы получите следующий файл cookie (если ваш домен www.example.com):

arrayCookie=peter,ester,john;expires=1365094617464;domain=www.example.com
1 голос
/ 20 февраля 2011

Создать массив в cookie, используя 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);
    }

}  });
0 голосов
/ 19 декабря 2016

Для этого примера вы можете сделать это довольно легко:

  • Сделать 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);
    }
    
  • Получить массив:

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

Для любого массива с другими типами значений, кроме строк:

  • 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);
    }
    
  • Retrieve Array:

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

Единственный недостаток в том, что идентичные значения не могут быть получены.

Не требуется JQuery, разделение запятыми или JSON.

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