当我处理数据时,我通常需要在循环中创建Arrays
或Objects
,让我们说“在运行中”。
让我们说例如我想要重新排列一个数组,该数组通过一个数组键对元素进行分组:我使用的一种方法是循环使用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作了一个例子,以防前面的片段解释不充分且不清楚。在小提琴中你有三个片段(两个注释掉)。
第一个是我在尝试像之前提到的那样的错误时得到的错误。 第二个是我使用的解决方案。 第三个是仅使用一个索引即时创建数组的示例。
总结一下,我想知道为什么,当你添加第二个索引时,你会得到那个错误。
谢谢!
答案 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)可以解决您的问题。