1

私はJavascriptが初めてで(C/C++に精通しています)、XMLファイルを解析してオブジェクトの配列に保存しようとしています。構造は、1 つのメイン リスト アイテムと場合によっては複数のリスト サブアイテムがある黒丸リストに似ています。

var MenuLine =
[{
    label : "null",
    icon : "null",
    Subitem:
    [{
        label : "null",
        icon : "null"
    }]
}];

これにより、次の構文を使用できます。

var someRandomSubitemText = MenuLine[2].Subitem[4].label;

.push メソッドを使用してこの配列にデータを入力しようとしました:

var tempMenuLine = [];
var tempSubitem = [];

$(xml).find("item").each(function()
{
    tempMenuLine.label = $(xml).children("label").text();
    tempMenuLine.icon = $(xml).children("icon").text();

    $(this).children("subitem").each(function()
    {
    tempSubitem.label = $(this).children("label").text();
    tempSubitem.icon = $(this).children("icon").text();
    tempMenuLine.Subitem.push(tempSubitem);
    });
    MenuLine.push(tempMenuLine);
});

ただし、.push メソッドが tempMenuLine への参照を渡し、反復ごとに tempMenuLine を上書きしているため、これは機能しません。次の構文に似たものを使用して、MenuLine 配列に直接書き込む方法はありますか?

$(xml).find("item").each(function(index1)
{
    MenuLine[index1].label = $(xml).children("label").text();
    MenuLine[index1].icon = $(xml).children("icon").text();

    $(this).children("subitem").each(function(index2)
    {

        MenuLine[index1].Subitem[index2].label = $(this).children("label").text();
        MenuLine[index1].Subitem[index2].icon = $(this).children("icon").text();
});

});
4

2 に答える 2

0

楽しみのためだけの再帰的なソリューション。

var MenuLine = Xml2Array(xmlText, 'item');

function Xml2Array(xmlDocument, itemName) {
  if (!$(itemName, xmlDocument).length) {
    return;
  }  
  var tmpArray = [];
  $(itemName, xmlDocument).each(function() {
    tmpArray.push({
      label: $('label', this).first().text(),
      icon: $('icon', this).first().text(),
      Subitem: Xml2Array(this, 'subitem')
    });
  });
  return tmpArray;
}
于 2013-01-29T18:17:21.017 に答える
0

temp var 宣言をループ内に移動します。

$(xml).find("item").each(function() {
    var tempMenuLine = [];
    tempMenuLine[0].label = $(xml).children("label").text();
    tempMenuLine[0].icon = $(xml).children("icon").text();
    tempMenuLine[0].Subitem = []

    $(this).children("subitem").each(function(){
        var tempSubitem = [];
        tempSubitem[0].label = $(this).children("label").text();
        tempSubitem[0].icon = $(this).children("icon").text();
        tempMenuLine[0].Subitem.push(tempSubitem);
    });
    MenuLine.push(tempMenuLine);
});

このようにして、ループの反復ごとに新しいアイテムを初期化し、前のアイテムへの「リンク」を削除します。

于 2013-01-29T15:22:07.087 に答える