2013-03-07 130 views
0

我有一个需要转换为二维数组的对象数组,因此我可以写入Google电子表格,其中每个属性都写入一个单元格。我有下面的功能:将对象属性存储在二维数组中

​​

示例对象:

object { 
    name: John 
    phone: 555-5555 
    email: [email protected] 
} 

的问题是,而不是把属性值在阵列元件(outputArray应该像[[John, 555-5555, [email protected]],[..., ..., ...]]其添加的属性,以每个阵列元素。

回答

1

在你的函数的第一部分,

function objectsToArray(objects) { 
    var outPutArray = createArray(objects.length, objects[0].length); 

它看起来像我们假定你是objects已经是一个二维数组。我将假设objects是一个像这样的对象的一维数组。 [{prop:value...},{...},{...}]

现在你想要做的是从这些数据生成2个数字指数。您需要确保2D数组的“第1列”对于所有对象都是相同的属性。

所以你的第一个for循环应该超过属性。此外,保持一个索引,让你知道你在哪个数字属性。

var j = 0; 
for (var prop in objects[0]) { 

然后你应该对所有对象进行循环。所以想法是,首先你要选择“名称”,然后遍历所有对象,为每个对象添加“名称”字段到二维数组。

for (var i in objects) { 
    outPutArray[i][j] = objects[i][prop]; 
    } 
    j++; 
} 

我认为你看到的主要问题是因为你没有使用数字指数。 (var j in objects[i]:这将j定义为一个属性,如“name”,而不是数字索引,就像您期待的那样)。

+0

这正是我的问题,我没有考虑使用单独的计数器并反转for循环。工作得很好,谢谢。 – 2013-03-07 06:00:37

+0

请注意,假设object [1]具有与object [0]相同的属性。如果每个对象都不同,那么我们手上就会有更多的麻烦。 ;-) – 2013-03-07 06:17:00

0

这里有一种方法......

function myFunction() { 
    var objects = {}; 
    objects[0] = {"name": "John", "phone": "555-5555", "email": "[email protected]"}; 
    objects[1] = {"name": "Mary", "phone": "444-4444", "email": "[email protected]"}; 
    var outputArrary = objectsToArray(objects); 
    Logger.log(outputArrary); 
} 

function objectsToArray(objects) { 
    var outputArray = []; 
    for (var i in objects) 
    outputArray.push([objects[i].name, objects[i].phone, objects[i].email]); 
    return outputArray; 
} 
+0

这就是我最初的处理方式,但如果所有代码的属性都改变了,并且由于我可能不会永远维护这个项目,我需要更动态的东西。 – 2013-03-07 06:01:43