[英]Iterate over KEYLESS JSON array?
我正在構建一個購物車,並使用cookie將購物車內容存儲在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
基於下面的@Samer答案,我將代碼更新為使用數組,如下所示:
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的價格=未定義”。
我想知道我做錯了什么?
更新2
仍然有麻煩。 也許我應該解釋一下我們如何將數據放入cookie。
當添加目錄項時,可以使用PHP(添加自定義項時)在服務器上更新cookie上的數組,或者使用Javascript在客戶端中更新cookie上的數組。
目前,我專注於添加在服務器端的項目。 我正在使用以下代碼添加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;
}
}
更新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;
}
}
如果JSON沒有鍵,則它是一個數組,只需使用數組而不是鍵/值對來構建數據。
var data = [
['CentOS', ''],
['Another Product', ...],
];
更新:
所以現在基於您的新答案,您似乎正在嘗試JSON.parse
實際數組。 JSON.parse
通常采用具有數組的字符串值,然后將其解析為實際數組。
要了解我的意思,請使用數據數組並通過JSON.stringify
運行它,您將看到輸出,然后可以通過JSON.parse
運行該輸出。
問題出在PHP中:您對數組進行json_encode兩次。
在這里,您手動對其進行了一次編碼:
$cookieVal .= ", [\\"9999.9999\\",\\"$sltOS\\",$vcpuPoints,\\"".$ramPoints."\\",$storagePoints,\\"".$baseServerCostMonthUSD."\\"]]";
然后在這里,您再做一次:
$cookieVal = json_encode($cookieVal);
因此,當您在javascript中解析json時,會得到一個字符串。 顯然,第二個basket[1][4]
為您提供了一個未定義的值,因為basket
是一個字符串,而basket[1]
是一個字符。
它有助於使用Firebug或其他調試實用程序來查看您在每個步驟中獲得的數據。
所以。 只需在PHP中構建一個數組數組,然后對其進行json_encode(一次),您的js就可以正常工作。
{
"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對象存在結構性問題。 您應該考慮一個更好的結構,一個普通的數組應該足夠好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.