1

我是 Javascript 新手(熟悉 C/C++),我正在尝试解析 XML 文件并将其存储在对象数组中。该结构类似于一个项目符号列表,其中有一个主列表项和可能的多个列表子项:

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

将你的 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 回答
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 回答