2013-07-29 2 views
1

장바구니를 만들고 쿠키를 사용하여 장바구니 내용을 JSON 개체에 저장하고 있습니다.KEYLESS JSON 배열을 반복할까요?

각 페이지에서 Javascript를 사용하여 쿠키를 검색하고 JSON을 구문 분석하고 각 행을 반복하여 설명 된 제품을 바구니 요약에 표시해야합니다.

배열에서 키를 사용하지 않기로 결정했습니다. 각 위치의 지정 레코드가 있으면 왜 쿠키에 저장해야합니까? 나는 그것이 영리한 생각이라고 생각했지만, 지금은 나의 모든 수색이 열쇠를 사용하라는 제안이다.

은 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"] 
} 
내가 좋아하는, 2 차 기록 (각 행의 마지막 필드에) 예를 들어, '가격'에 액세스 할 수 있도록 기대하고 있었다

그래서 :

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

그것은 작동하지 않습니다.

이 질문에는 실제로 두 부분이 있습니다.

  1. 바구니에서 직접 값을 선택하는 방법?
  2. 어떻게 반복하여 각 행을 차례로 조작 할 수 있습니까?

첫 번째 입력란에 궁금한 점이 있습니다. 그것이 제품의 SKU입니다. 두 개의 "9999.9999"가있는 이유는 예약 된 번호로 제품이 '사용자 지정'제품 (카탈로그 항목을 직접 참조하지 않음)임을 나타 내기 때문입니다. 다음과 같이 @ 아래 인 Samer의 답변에 따라

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"] 
] 

나 ' m 이제 다음과 같이 쿠키에서 액세스하려고합니다 :

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

경고 대신 '상품 2의 가격 = 12.99' '상품 2의 가격 = 정의되지 않음'이 표시됩니다.

나는 무엇을 잘못했는지 궁금합니다.

UPDATE 아직이에 문제가 2

. 어쩌면 쿠키에 데이터를 가져 오는 방법을 설명해야 할 것입니다.

쿠키의 배열은 PHP (사용자 정의 항목 추가시) 또는 카탈로그 항목 추가시 Javascript를 사용하는 클라이언트 측을 사용하여 서버에서 업데이트 할 수 있습니다.

현재 저는 서버 쪽을 추가 한 항목에 집중하고 있습니다.나는 쿠키를 추가하려면 다음 코드를 사용하고 있습니다 :

<? 
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, '/'); 

그런 다음 쿠키를 읽기 위해, 나는 페이지가로드 될 때 호출되는이,이 클라이언트 측 :

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, '/'); 

자바 스크립트 :

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을 오염시키지 않은 경우에만 ... for ...를 안전하게 사용할 수 있습니다. for ... in은 그것들도 반복 할 것입니다. 가능한 경우 "getOwnPropertyNames"를 사용하십시오. –

+0

'hasOwnProperty()'체크를 추가 할 때'for..in'을 사용해도 안전합니다. 'getOwnPropertyNames()'는 최신 브라우저에서만 작동합니다. 내 downvote 아니지만. – Teemu

0

PHP에서 문제가 발생했습니다 : 배열을 두 번 json_encode하면됩니다. 여기

수동으로 한 번 인코딩 :

여기 그런

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

, 다시 그것을 할 : 당신이 그것을 JSON 구문 분석 할 때 $cookieVal = json_encode($cookieVal);

그래서 결과적으로 당신은 문자열을 얻을 자바 스크립트. 분명히 두 번째 basket[1][4]basket이 문자열이고 basket[1]이 문자이므로 정의되지 않은 값을 제공합니다.

방화 광구 또는 다른 디버깅 유틸리티를 사용하면 매 단계마다 어떤 데이터를 얻을 수 있는지 살펴볼 수 있습니다.

So. PHP에서 배열 배열을 만든 다음 json_encode (한 번)하면 js가 작동합니다.