在Javascript中的循环上创建嵌套数组

时间:2013-01-21 19:35:25

标签: javascript arrays for-loop

当我处理数据时,我通常需要在循环中创建ArraysObjects,让我们说“在运行中”。

让我们说例如我想要重新排列一个数组,该数组通过一个数组键对元素进行分组:我使用的一种方法是循环使用for in。但问题是我在运行中定义了多个索引。

for(key in array){
   newArray[array[key]['gouping_key']] = array[key];
}

这个例子很好用。但是,如果您有多个具有相同grouping_key的元素,则此代码将覆盖您之前的元素。

所以,我试试这个:

var i = 0;
for(key in array){
   newArray[array[key]['gouping_key']][i] = array[key];
   i++
}

但是当我添加第二个索引时,解释器会抱怨说newArray[array[key]['gouping_key']]undefined。在上一个例子中似乎没有问题。

为什么?

我已经用this fiddle作了一个例子,以防前面的片段解释不充分且不清楚。在小提琴中你有三个片段(两个注释掉)。

第一个是我在尝试像之前提到的那样的错误时得到的错误。 第二个是我使用的解决方案。 第三个是仅使用一个索引即时创建数组的示例。

总结一下,我想知道为什么,当你添加第二个索引时,你会得到那个错误。

谢谢!

2 个答案:

答案 0 :(得分:3)

var i = 0;
for(key in array){

   // If nested object doesn't exist, make an empty one.
   newArray[array[key]['gouping_key']][i] =
     newArray[array[key]['gouping_key']][i] || [];

   newArray[array[key]['gouping_key']][i] = array[key];
   i++
}

您需要创建一个要推送的数组,它不是为您创建的。您可以使用||运算符仅创建一个空数组undefined

此外,这需要很多嵌套......如果我可以......

var x, y;
y = 0;
for(key in array){
   x = array[key].gouping_key;
   newArray[x][y] = newArray[x][y] || []
   newArray[x][y] = array[key];
   y++
}

看看它的可读性有多大?它也更快!你不必一遍又一遍地深入遍历复杂的物体。

答案 1 :(得分:0)

首先用于for for数组并不是一个好主意,它并不是你想象的那样。见:https://stackoverflow.com/a/4261096/1924298。使用简单的for循环(或while)可以解决您的问题。