1

真の特定の要素(この場合はすべて「widget」クラス)をループし、idとtitle(後でさらに多くのもの)を取得して、localStorageにJSONとして保存します(データを文字列化するため、文字列である必要があります) 、localStorageからデータを取得し、結果をループします。ループしたい(JSON出力が有効)まではすべてうまくいきますが、これは機能しません。私は1日以上取り組んでいるので、私が間違っていることを誰かに見てもらいたいと思います。

(はい、私はウェブを見ました)

私はまだこれに慣れていないので、これを保存してループするより良い方法がある場合は私に知らせてください。

// html

<div class="widget" id="w1">
   <h2>some text</h2>
</div>

...
...
...

//データを設定します

var storeStr = '';
    storeStr += '{"widget":[';
$('.widget').each(function(){                   
    storeStr += '{';                                
    storeStr += '"id": "'+$(this).attr('id')+'",';
    storeStr += '"title": "'+$(this).children('h2').text()+'"';
    storeStr += '},';
});
storeStr += ']}';
var storeStr = storeStr.replace(/\},]/g,'}]');// comma cleanup
localStorage.setItem('thelskey', storeStr);                     

// output(json valid)

{ 
  "widget":[
     {"id": "w1","title": "xxxxx"},
     {"id": "w2","title": "xxxxx"},
     {"id": "w3","title": "xxxxx"},
     {"id": "w4","title": "xxxxx"}
  ]
}

//ループ

var json = JSON.parse(localStorage.getItem('thelskey'));

for(var key in json){
    //output
}
4

3 に答える 3

2

ループ内で文字列を形成するのではなく、単にオブジェクトリテラルを作成してから、それにデータをプッシュしないのはなぜですか。

var store = [];
var i = 0;
$('.widget').each(function(){
 var obj = {};
 obj['id'] = $(this).attr('id');
 obj['title'] = $(this).children('h2').text();
 store.push(obj);
});
storeObj = {'widget':store};
localStorage.setItem('thelskey', storeObj);
于 2012-07-02T11:45:53.483 に答える
1

JSONオブジェクトにはキーが1つだけあります"widget"。したがって、ループする意味はありません。すべてのウィジェットデータを取得する場合は、widgetプロパティの下の各アイテムをループする必要があります。

for (var key in json.widget) {
  // output
}

それ以外の場合は、配列を余分なオブジェクトでラップせず、JSONを次のように作成します。

[
  {"id": "w1","title": "xxxxx"},
  {"id": "w2","title": "xxxxx"},
  {"id": "w3","title": "xxxxx"},
  {"id": "w4","title": "xxxxx"}
]

現在、JSONオブジェクトの構造を理解していないように感じます。

{
  widget: [
    {
      id: "w1",
      title: "xxxxx"
    },
    {
      id: "w2",
      title: "xxxxx"
    },
    {
      id: "w3",
      title: "xxxxx"
    },
    ...
  ]
}

これは、3次元の連想配列(または互いにネストされた3層の連想配列)と考えることができます。

/* in PHP code because JS doesn't have associative arrays */

$json = array( // first layer
  'widget' => array( // second layer
    0 => array( // third layer
      'id' => 'w1',
      'tit;e' => 'xxxxx'
    ),
    1 => array( // third layer
      'id' => 'w2',
      'tit;e' => 'xxxxx'
    ),
    2 => array( // third layer
      'id' => 'w3',
      'tit;e' => 'xxxxx'
    ),
    ...
  )
);

$json現在、アイテムが1つしかないの最初のディメンションをループしようとしています。したがって、発生するエラーは、アクセスしようとしているためです。

$json[$key]['widget']['id'] // $key = 'widget'

実際にアクセスしようとしている必要がある場合:

$json['widget'][$key]['id'] // $key = 1, 2, 3, 4

または、データ構造の最初のレイヤーを削除して、次の場所にアクセスすることもできます。

$json[$key]['id'] // $key = 1, 2, 3, 4

将来このような問題を回避するには、Firebugやnode.jsなどのJSコンソール、または最新のブラウザに搭載されている組み込みのJSコンソールを利用してください。単に次のようなことをします:

console.log(json);

また

foreach (key in json) {
  console.log(key);
  console.log(json[key]);
}

問題を明らかにしたでしょう。

于 2012-07-02T11:44:38.443 に答える
0
var widget = [];
widget[0] = {"id":"w1", "title":"123"};
widget[1] = {"id":"w2", "title":"12322"};
widget[2] = {"id":"w3", "title":"12333"};
widget[3] = {"id":"w4", "title":"12344"};
widget[4] = {"id":"w5", "title":"12355"};

localStorage.setItem("db", JSON.stringify(widget));

var widget1 = JSON.parse(localStorage.getItem('db'));
于 2012-07-02T11:52:07.960 に答える