使用嵌入的对象数组填充Javascript对象数组

时间:2013-01-29 15:13:37

标签: javascript arrays

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

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();
});

});

2 个答案:

答案 0 :(得分: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);
});

这样,您为循环的每次迭代初始化一个新项目,删除它与前一项目的“链接”。

答案 1 :(得分: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;
}