Как правильно хранить массив объектов в куки, используя json.stringify?

Я пытаюсь сохранить массив объектов в cookie-файле с помощью JSON.Stringify, но у меня возникла проблема, когда я анализирую cookie-файл и пытаюсь передать новый объект в массив, чтобы затем снова его преобразовать в строку. Это говорит мне, что comments.push не является функцией.

var comments = [];
var myData = 0;

function setCookie(cname, cvalue, exdays) {
    var d = new Date();
    d.setTime(d.getTime() + (exdays*24*60*60*1000));
    var expires = "expires="+d.toUTCString();
    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 "";
}

function checkCookie() {
    var commentAux = getCookie("myComments");
    if (commentAux != "") {
        //alert("Welcome again " + user);
        return true;
    } else {
        return false;
    }
}

function validateComment() {
 var x = document.forms["commentForm"]["commentSection"].value;
 if (x == null || x == "") {
  alert("There's nothing to comment, write something to proceed.");
  return false;
 } else {
  var comment = {
   firstName:"Name",
   lastName:"Surname",
   text:x
  };
  if (checkCookie() == false) {
   setCookie("myComments", JSON.stringify(comment), 1);
  } else {
   myData = getCookie("myComments");
   comments = JSON.parse(myData);
   alert(comments);
   comments.push(comment);
   setCookie("myComments", JSON.stringify(comments), 1);
  }
 }
 alert(comments.length);
}
<!DOCTYPE html>
<html>
 <head>
  <title>Facebook Simulator by Azael Alanis</title>
  <link rel="stylesheet" type="text/css" href="style.css">
  <script src="javascript.js"></script>
 </head>
 <body>
  <img src="facebook-banner.png" alt="Facebook-Banner" style="height:100px;width:800px">
  <div id="section">
   <form name="commentForm" onsubmit="validateComment()">
    <input type="text" name="commentSection" placeholder="What's on your mind?"><button class="buttonText">Enviar</button>
   </form> 
  </div>
 </body>
</html> 

В чем может быть проблема? Я просто хочу разобрать мой файл cookie -> добавить новый объект в массив -> снова его зашифровать

Спасибо

2 ответа

Решение

Вы используете этот код:

var comment = { /* ... */ };
if (checkCookie() == false) {
    setCookie("myComments", JSON.stringify(comment), 1);
} else {
    comments = JSON.parse(getCookie("myComments"));
    comments.push(comment);
    setCookie("myComments", JSON.stringify(comments), 1);
}

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

Поэтому в следующий раз, когда вы попытаетесь подтолкнуть другой commentВы не можете.

Вместо этого попробуйте следующее:

var comment = { /* ... */ };
if (checkCookie() == false) {
    setCookie("myComments", JSON.stringify([comment]), 1); // <-- array
} else {
    comments = JSON.parse(getCookie("myComments"));
    comments.push(comment);
    setCookie("myComments", JSON.stringify(comments), 1);
}

Это ваша проблема:

comments = JSON.parse(myData);
comments.push(comment);

Вы, вероятно, хотели сделать

var comment = JSON.parse(myData);
comments.push(comment);

поскольку JSON.parse(myData) возвращает объект комментария.

Другие вопросы по тегам