【问题标题】:parsing cookie with json (array), array."push" now not a function [closed]用json(数组)解析cookie,array.“push”现在不是函数[关闭]
【发布时间】:2017-07-01 15:34:04
【问题描述】:
var parsed = JSON.parse($.cookie('inavm_inventory'));

inventoryID = parsed['ids'];
inventoryName = parsed['names'];
inventoryCount = parsed['productcount'];

我有一个 cookie“inavm_inventory”,其中包含 3 个数组,“ids”、“names”和“productcount”。

如上所示,我还有 3 个局部变量。

目前添加到 cookie 中一切正常 - 但是当用户加载页面时,我试图将 cookie 数组推送到局部变量中。

没有上面的代码一切都可以正常工作,但是当使用上面的代码时 - 它会破坏“数组”。我已经记录了这些值,它们看起来像数组,但我猜它们可能被格式化为字符串。

我只是试图将它们格式化回数组,以便 .push 再次在我的数组上工作。

Cookie 示例数据:

{
    "ids": "[\"quant[2]\",\"quant[3]\"]",
    "names": "[\"2 3 Seater Sofa\",\"0 2 Seater Sofa\"]",
    "productcount": "[8,0]"
}

【问题讨论】:

  • 仅使用您发布的代码真的很难提供帮助。 (还要注意parsed['ids']可以写成parsed.ids。)
  • 你使用parsed的方式,它看起来不像是一个数组。因此,如果您致电 parsed.push(...) 并且它不起作用(如果您正在这样做的话)也就不足为奇了。
  • Cookie 数据示例:{"ids":"[\"quant[2]\",\"quant[3]\"]","names":"[\"2 3 Seater沙发\",\"0 2 人沙发\"]","productcount":"[8,0]"}
  • 太棒了!使用“编辑”链接来显示,而不是评论。 (请务必对其进行格式化。)同时向我们展示您尝试运行的失败代码。
  • cookie 中没有数组。再说一遍:我们需要看看你正在尝试做的事情是失败的。

标签: javascript php arrays json cookies


【解决方案1】:

您的 cookie 包含一个具有三个属性的对象。这些属性的值都是字符串,而不是数组。

如果它们是数组,如下所示:

{
    "ids": ["quant[2]","quant[3]"],
    "names": ["2 3 Seater Sofa","0 2 Seater Sofa"],
    "productcount": [8,0]
}

所以你想看看是什么产生了 cookie 值并更正它,以便正确输出这三个数组。

如果您使用 JavaScript 创建它,这将正确地创建上面的内容(从片段构建它;上面也可以作为单个块工作,但您可能不是这样做的):

var obj = {};
obj.ids = ["quant[2]","quant[3]"];
obj.names = ["2 3 Seater Sofa","0 2 Seater Sofa"];
obj.productcount = [8,0];

甚至

var obj = {
    ids: [],
    names: [],
    productcount: []
};
obj.ids.push("quant[2]");
obj.names.push("2 3 Seater Sofa");
obj.productcount.push(8);
obj.ids.push("quant[3]");
obj.names.push(["0 2 Seater Sofa"]);
obj.productcount.push(0);

然后创建cookie:

$.cookie('inavm_inventory', JSON.stringify(obj)));

不过,您可能会考虑完全改变结构,并使用单个对象数组:

[
    {
        id: "quant[2]",
        names: "2 3 Seater Sofa",
        count: 8
    },
    {
        id: "quant[3]",
        name: "0 2 Seater Sofa",
        count: 0
    }
]

然后,一旦你解析了它,你就会使用对象:

console.log(parsed[0].id);    // "quant[2]"
console.log(parsed[0].name);  // "2 3 Seater Sofa"
console.log(parsed[0].count); // 8

...等等(可能在循环中)。

所以你可以从这里开始:

var products = [];

并将完整的项目推入该数组:

products.push({id: "quant[2]", name: "2 3 Seater Sofa", count: 8});

【讨论】:

  • 感谢您的意见。 Cookies 不允许使用数组,这就是它们是字符串的原因。我应该提到我使用 stringify 来执行此操作,以便我可以使用以下方法将“数组”放入我的 cookie: document.cookie = "inavm_inventory=" + JSON.stringify({ids: JSON.stringify(inventoryID), names: JSON.stringify(inventoryName), productcount: JSON.stringify(inventoryCount)}) + "; max-age=2592000;";
  • @user3676945:当然cookies不允许数组;这就是我在上面使用JSON.stringify 的原因。它与替代结构和原始结构一样适用。在这两种情况下,我们存储的是 JSON,它是一个字符串。
  • 根据这篇文章的建议,我最初在哪里找到了解决方案:stackoverflow.com/questions/2980143/… 我使用 JSON.parse 从 stringify 中检索返回的数组...但是,它导致了我当前的问题其中不是数组类型。不知何故需要将它们转换回数组。我尝试使用“inventoryID = [inventoryID]”以这种方式将它们转换为数组,但效果不太好
  • @user3676945:很简单:使用对象数组。在 cookie 中存储该信息时,您可以这样做:$.cookie("cookiename", JSON.stringify(theArray))。当从 cookie 中检索信息时,您可以这样做:theArray = JSON.parse($.cookie("cookiename")) 我建议对 JSON 进行一些阅读,这是一种 textual 表示法(因此,您可以将字符串存储在 cookie 中)。请注意,cookie 通常不是正确的答案,除非您与服务器交换它们。如果不是,请改用localStorage(也只是字符串)。
猜你喜欢
  • 1970-01-01
  • 2020-09-27
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
相关资源
最近更新 更多