我正在构建购物车并使用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];
这似乎并不奏效。
这个问题实际上有两个部分。
- 如何樱桃直接从篮子中选择价值?
- 如何遍历它,允许我依次操作每一行?
如果你想知道关于第一个字段。这是产品的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;
}
}
你不能重复键,它会是唯一的 –
它表示数据结构设计中存在问题。值得考虑使用数组来代替购物车物品。即以SKU作为值而不是'钥匙'。顺便说一下,Arun指出,你不能在JSON对象中有重复的键。 – DavidLin
@PeterSnow你需要使用括号表示法:'var price = basket ['0002.0004'] [4]'这样做。但就像在上面的评论中所说的那样,对象中的键必须是唯一的。 – Teemu