将对象属性存储在二维数组中

时间:2013-03-07 00:45:33

标签: google-apps-script

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

function objectsToArray(objects) {
  var outPutArray = createArray(objects.length, objects[0].length);
  for (var i in objects) {
    for (var j in objects[i]) {
      if (objects.hasOwnProperty(i)) {
        outPutArray[i][j] = objects[i][j];
      }
    }
  }

  return outPutArray;
}

示例对象:

object {
  name: John
  phone: 555-5555
  email: john@john.com
}

问题是,不是将属性值放在数组元素中(outputArray应该看起来像[[John, 555-5555, john@john.com],[..., ..., ...]],而是将属性添加到每个数组元素。

2 个答案:

答案 0 :(得分:1)

在你的功能的第一部分,

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

看起来您假设objects已经是2D数组。我将假设objects是这样的一维对象数组。 [{prop:value...},{...},{...}]

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

所以你的第一个for循环应该是属性。另外,请保留一个索引,以便了解您所使用的号码属性。

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

然后你应该对所有对象进行循环。因此,我们的想法是首先选择“名称”,然后浏览所有对象,将“名称”字段添加到每个对象的2D数组中。

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

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

答案 1 :(得分:0)

这是一种方式......

function myFunction() {
  var objects = {};
  objects[0] = {"name": "John", "phone": "555-5555", "email": "john@john.com"};
  objects[1] = {"name": "Mary", "phone": "444-4444", "email": "mary@mary.com"};
  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;
}