2013-07-29 56 views
1

我正在构建购物车并使用cookie将购物车内容存储在JSON对象中。遍历无KEY的JSON数组?

在每一页上,使用Javascript,我需要检索的cookie,解析JSON和遍历每一行,显示在篮下总结所描述的产品。

我决定不再在阵列中使用的密钥,因为如果我有每个位置的指定,为什么我需要将其存储在cookie中的记录。我认为这是一个聪明的想法,但现在我所有的搜索结果都是使用密钥的建议。

这是JSON的一个样本:

{ 
    "9999.9999":["CentOS6",2,"0.5",150,"23.90"], 
    "0002.0004":["Support5","","3",5,"12.99"], 
    "9999.9999":["UbuntuServer12.04LTS",1,"1",220,"42.60"] 
} 

我期待能够访问第二记录的例如“价格”(这是在每行的最后一个字段),如所以:

basket = JSON.parse(basket); 
price = basket[1][4]; 

这似乎并不奏效。

这个问题实际上有两个部分。

  1. 如何樱桃直接从篮子中选择价值?
  2. 如何遍历它,允许我依次操作每一行?

如果你想知道关于第一个字段。这是产品的SKU。有两个“9999.9999”的原因是因为这是一个保留号码,表示该产品是“自定义”产品(不直接指向目录项目)。

UPDATE

基于@下面萨默尔的回答,我已经更新为使用数组的代码,如下所示:

的JSON现在看起来是这样的:

[ 
    ["9999.9999","CentOS6",2,"0.5",150,"23.90"], 
    ["0002.0004","Support5","","3",5,"12.99"], 
    ["9999.9999","UbuntuServer12.04LTS",1,"1",220,"42.60"] 
] 

我男试图从cookie访问如下:

var basket = readCookie('basket'); 
basket  = JSON.parse(basket); 
alert('Price of item 2 =' + basket[1][5]); 

只是,不是提醒,'项目2的价格= 12.99'我得到'项目2的价格=未定义'。

我不知道我做了什么错?

UPDATE 2

仍然具有这种麻烦。也许我应该解释我们如何获取数据到cookie中。

在cookie中的阵列可以在服务器上使用PHP(添加自定义项目时)的使用Javascript当添加目录项或客户端来更新。

目前,我专注于项目增加服务器端。我用下面的代码添加cookie:

<? 
extract($_POST, EXTR_SKIP); 

// Get contents of existing basket (if any) minus last ']' 
// so that it's ready to be added to. 

if (isset($_COOKIE['basket'])) { 

    $basket = json_decode($_COOKIE['basket']); 
    $chars = strlen($basket)-1; 
    //echo "<pre>".var_dump($basket)."</pre>"; 

    $cookieVal = substr($basket, 0, $chars); 

    $cookieVal .= ", 
    [\"9999.9999\",\"$sltOS\",$vcpuPoints,\"".$ramPoints."\",$storagePoints,\"".$baseServerCostMonthUSD."\"]]"; 

    $cookieVal = json_encode($cookieVal); 
    /* 
    * Sample format 
    * 
    [["9999.9999","CentOS6",2,"0.5",150,"23.90"], 
    ["0002.0004","Support5","","3",5,"12.99"], 
    ["9999.9999","UbuntuServer12.04LTS",1,"1",220,"42.60"]] 
    * 
    */ 

} else { 

    $cookieVal = json_encode("[[\"9999.9999\",\"$sltOS\",$vcpuPoints,\"".$ramPoints."\",$storagePoints,\"".$baseServerCostMonthUSD."\"]]"); 

} 

$exp = time()+3600; // sets expiry to 1 hour; 
setcookie ('basket' , $cookieVal, $exp, '/'); 

然后客户端读取cookie的,我有这样的,当页面加载它被称为:

function initBasket() { 

    var basket = readCookie('basket'); 

    if (isJSON(basket)) { 

     // We'll populate the basket 

     basket = JSON.parse(basket); 
     alert(basket[1][5]); 

    } else { 

     $('#sList').html('Your basket is empty.'); 
     return; 

    } 

} 

UPDATE 3 终于搞定了。谢谢你的帮助。

也许代码可以帮助别人,所以我已经包括下面的最终代码:

的PHP:

if (isset($_COOKIE['basket'])) { 

    $cookieVal  = json_decode($_COOKIE['basket']); 
    $cookieVal[] = array 
         (
          "9999.9999", 
          $sltOS, 
          $vcpuPoints, 
          $ramPoints, 
          $storagePoints, 
          $baseServerCostMonthUSD 
         ); 
    $cookieVal  = json_encode($cookieVal); 

} else { 

    $cookieArr[] = array 
         (
          "9999.9999", 
          $sltOS, 
          $vcpuPoints, 
          $ramPoints, 
          $storagePoints, 
          $baseServerCostMonthUSD 
         ); 
    $cookieVal  = json_encode($cookieArr); 

} 

// Save VPS choice in basket cookie 
$exp = time()+3600; // sets expiry to 1 hour; 
setcookie ('basket' , $cookieVal, $exp, '/'); 

的JavaScript:

function initBasket() { 

    var basket = readCookie('basket'); 

    if (isJSON(basket)) { 

     // We'll populate the basket 
     basket = JSON.parse(basket); 
     alert(basket[1][5]); 

    } else { 

     $('#sList').html('Your basket is empty.'); 
     return; 

    } 

} 
+3

你不能重复键,它会是唯一的 –

+1

它表示数据结构设计中存在问题。值得考虑使用数组来代替购物车物品。即以SKU作为值而不是'钥匙'。顺便说一下,Arun指出,你不能在JSON对象中有重复的键。 – DavidLin

+0

@PeterSnow你需要使用括号表示法:'var price = basket ['0002.0004'] [4]'这样做。但就像在上面的评论中所说的那样,对象中的键必须是唯一的。 – Teemu

回答

3

如果JSON没有然后它是一个数组,只需使用数组而不是键/值对来构建数据。

var data = [ 
    ['CentOS', ''], 
    ['Another Product', ...], 
]; 

UPDATE:

所以,现在根据新的答案,它看起来像你想JSON.parse实际的数组。 JSON.parse通常接受一个包含数组的字符串值,然后将其解析为一个实际的数组。

要明白我的意思把你的数据阵列,并通过JSON.stringify运行它,你会看到输出,同样的输出,那么你可以运行它通过JSON.parse

+0

你有额外的''' –

+0

我使用你的解决方案更新了我的问题。关了。我现在只是无法访问数组值。如果我可以让我的语法正确,那么它就解决了。 –

+0

@PeterSnow请参阅我的更新评论 – Samer

-1
{ 
    "9999.9999":["CentOS6",2,"0.5",150,"23.90"], 
    "0002.0004":["Support5","","3",5,"12.99"], 
    "9999.9999":["UbuntuServer12.04LTS",1,"1",220,"42.60"] 
} 

心灵的大括号。这表明这是一个对象。

您不能通过数字索引遍历对象。 还要介意重复键“9999.9999”,第一行将被第三行覆盖。

您可能尝试使用for-in循环来循环对象,但不建议这样做。

var basket = JSON.parse(basket); 
for(var key in basket) 
{ 
    var price = basket[key][4]; 
    // do something with the price. 
} 

无论如何,这个JSON对象有结构性的问题。你应该考虑一个更好的结构,一个普通的旧数组应该足够好。

+1

为什么'for..in'不推荐迭代对象属性?虽然这是长久以来唯一的方法。 – Teemu

+0

为什么是-1? 只有确保没有污染Object.prototype时,才能安全地使用...。因为...也会循环通过这些。如果可用,请使用“getOwnPropertyNames”。 –

+0

添加'hasOwnProperty()'检查时,您可以安全地使用'for..in'。 'getOwnPropertyNames()'仅适用于现代浏览器。不是我倒下了。 – Teemu

0

问题出在PHP:你json_encode你的数组两次。

在这里,您手动编码一次:

$cookieVal .= ", [\"9999.9999\",\"$sltOS\",$vcpuPoints,\"".$ramPoints."\",$storagePoints,\"".$baseServerCostMonthUSD."\"]]";

然后在这里,你再这样做:

$cookieVal = json_encode($cookieVal);

因此,作为一个结果,当你解析JSON它,你得到一个字符串在JavaScript中。 很明显,第二个basket[1][4]给你一个未定义的值,因为basket是一个字符串,basket[1]是一个字符。

它有助于使用萤火虫或其他调试工具,看看你在每一步得到的数据。

所以。只需在PHP中构建一个数组数组,然后对它进行json_encode(一次),并且您的js应该可以工作。