0

我想念VB。或许这很悲哀……

我需要制作一个“3 维”数组来表示以下数据。数据以 XML 开头,并被解析为 2D“数组数组”,如下所示(为清楚起见添加了描述符):

[NodeArray]
    [Node: 0][Year: 2012][Quantity1: 3][Quantity2: 5] [Title: Orange]
    [Node: 1][Year: 2012][Quantity1: 5][Quantity2: 9] [Title: Apple]
    [Node: 2][Year: 2011][Quantity1: 4][Quantity2: 9] [Title: Orange]
    [Node: 3][Year: 2011][Quantity1: 8][Quantity2: 12] [Title: Apple]
    [Node: 4][Year: 2010][Quantity1: 2][Quantity2: 6] [Title: Orange]
    [Node: 5][Year: 2010][Quantity1: 10][Quantity2: 2] [Title: Apple]

我想将此 2-D 数组解析为 3-D 对象数组,如下所示:

[Year Array]
    [2012]
        [Quantity1]: [3],[7]
        [Quantity2]: [5],[9]
        [Title]: [Orange],[Apple]
    [2011]
        [Quantity1]: [4],[8]
        [Quantity2]: [9],[12]
        [Title]: [Orange],[Apple]
    [2010]
        [Quantity1]: [2],[10]
        [Quantity2]: [6],[2]
        [Title]: [Orange],[Apple]

在 VB 中,这非常简单。我会查看我的原始数据并重新调整我的数组以适应每个维度中的最大条目数。然后我将遍历数据并将其加载...

如果 2012 年索引 = 0,则“Array(0,1,1)”将返回“9”

我相信这可以用 JSON 完成,但我没有足够的经验知道如何操作。我希望这个问题足够具体,可以对我想要完成的工作提供一些见解。

------------------编辑和新代码-----------------

我很感激答案。

我意识到我目前的致命缺陷是我没有使用 JSON 构建我的二维数组(尽管我的示例看起来是这样的)。这是我用来构建二维数组的方法:

for(i=0; i<titleArray.length; i++)
{
rowArray[i] = [yearArray[i], titleArray[i],quantityOneArray[i],quantityTwoArray[i]];
}

因为每个数组中总是有相同数量的条目,所以我可以可靠地使用一个数组的长度来遍历所有关联的数组。我也意识到使用“i++”是中学做事的方式,所以我对更优雅的索引方法的建议持开放态度。

但是假设我想用 JSON 构建它?我相信这还不是 JSON 格式……如果是的话,我应该可以说“rowArray[i].year”是吗?

再次感谢 - 我很幸运有这样一个活跃的社区。

-------------------- EDIT2 & 新代码--------------------

好的,我想我破解了 JSON 的问题。我喜欢你!我只需要稍微不同地格式化数组对象,现在我可以使用 .whatever 属性来调用数组的成员!

for(i=0; i<titleArray.length; i++) 
{
rowArray[i] = {"year":yearArray[i], "title":titleArray[i],"quantity1":quantityOneArray[i],"quantity2":quantityTwoArray[i]};
console.log("rowArray["+i+"]: " + rowArray[i].year + ", " + rowArray[i].title +", "+rowArray[i].quantity1+", "+rowArray[i].quantity2);
}

现在对于 3-D 阵列...

4

3 回答 3

2

作为 JSON 对象的数据看起来像

var data = 
{
    "2011": {
        "Quantity1": [ 3, 7],
        "Quantity2": [ 5, 9],
        "Title": [
            "Orange",
            "Apple"
        ]
    },
    "2012": {
        "Quantity1": [ 4, 8],
        "Quantity2": [ 9, 12],
        "Title": [
            "Orange",
            "Apple"
        ]
    }, 
    ...
}

请注意,我在结构的前 2 个级别使用了一个对象,这样您就可以使用字符串对它们进行索引。例如,你Array(0,1,1)会变成data["2011"]["Quantity2"][1].

或者,您可以使用数组并拥有

var data = 
[
    [
        [ 3, 7],
        [ 5, 9],
        [ "Orange",
          "Apple" ]
    ],
    [
        [ 4, 8],
        [ 9, 12],
        [ "Orange",
            "Apple" ]
    ], 
    ...
]

然后你可以这样做data[0][1][1]很像你的 VB 示例。

于 2012-08-15T14:46:16.013 回答
1

这样的事情应该这样做:

var year_array = new Array(); // empty array
for ( node in node_array )
{
    if ( !year_array.hasOwnProperty(node.year) ) // if year is not in array yet
    {
        year_array[node.year] = new Array(); // create an empty array for it
    }
    year_array[node.year].push({
        "quantity1": node.quantity1,
        "quantity2": node.quantity2,
        "title": node.title,
    });
}

所有这一切都是通过 2D 数组,并将值以呈现的格式放入 3D 数组中。唯一棘手的是if ( !year_array.hasOwnProperty(node.year) )块,它会在每年的条目第一次出现时对其进行初始化。

于 2012-08-15T14:44:25.557 回答
0

标准 JavaScript 与 VB 非常相似,如果您可以在 VB 中完成,那对您来说应该不是问题。

于 2012-08-15T14:44:44.570 回答