0

当我处理数据时,我通常需要创建 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']]is undefined。在前面的示例中似乎没有问题。

这是为什么?

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

第一个是我在尝试类似我之前提到的内容时遇到的错误。第二个是我使用的解决方案。第三个例子是动态创建一个只有一个索引的数组。

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

谢谢!

4

2 回答 2

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++
}

看看这有多少可读性?它也更快!您不必一遍又一遍地深入遍历复杂的对象。

于 2013-01-21T19:40:09.837 回答
0

首先将 for in 用于数组不是一个好主意,我认为它不是您所期望的。见:https ://stackoverflow.com/a/4261096/1924298 。使用简单的 for 循环(或 while)应该可以解决您的问题。

于 2013-01-21T19:43:15.767 回答