App脚本教程混乱

时间:2011-08-17 04:10:25

标签: javascript google-apps-script

教程在这里:Tutorial: Writing Spreadsheet data using JavaScript Objects

完整的代码可以在本教程的最后找到。

我没有在第一个函数runExample()

中获得for循环
  for (var i = 0; i < data.length; ++i) {
    var rowData = data[i];
    if (!dataByDepartment[rowData.department]) {
      dataByDepartment[rowData.department] = [];
      departments.push(rowData.department);
    }
    dataByDepartment[rowData.department].push(rowData);
  }

我不知道 if -statement中的内容。 它们是什么意思 dataByDepartment [rowData.department]) ???

dataByDepartment 最初是空的......这会创建一个属性吗?

有人可以解释整个循环在做什么吗?非常感谢你!

PS:我还是Javascript的新手......来自C编程我总是对对象和属性创作感到困惑......

2 个答案:

答案 0 :(得分:1)

你到了那里。

dataByDepartment[rowData.department]

// is the same as
var myKey = rowData.department // you can use dot or bracket notation
dataByDepartment[myKey]

如果密钥存在,那么它不是未定义 - 它将评估 true 。如果密钥不存在,则未定义 - 它将评估 false

因此if语句与此

相同
if ( !dataByDepartment[myKey]) {

// which is logically the same as (note that === does not coerce type)
if ( typeof(dataByDepartment[myKey]) === 'undefined' ) {

询问您是否需要更多澄清:)

答案 1 :(得分:1)

一般而言,循环的功能是使用每个(不同)部门的一个属性填充dataByDepartment对象,其中每个属性将引用适用于该部门的数据数组。循环的每次迭代首先检查当前部门是否已有属性,如果没有则创建它。如果它确实需要创建一个新属性,它还会将部门添加到departments数组。

一些背景知识:以下语句创建一个最初没有属性的对象:

var dataByDepartment = {};

要为该对象指定值为“value1”的属性“key1”,您可以说:

dataByDepartment.key1 = "value1";
// or
dataByDepartment["key1"] = "value1";

请注意,如果已存在名为“key1”的属性,则会覆盖该属性。方括号语法允许您使用可变的属性键名称。所以你可以说:

var myKey = "key2";
dataByDepartment[myKey] = "value2";

这将创建一个名称等于myKey计算结果的属性(在本例中为“key2”),以及值“value2”。

回到你引用的实际代码,if语句:

if (!dataByDepartment[rowData.department]) {

正在检查dataByDepartment是否已经拥有一个键名等于rowData.department中的任何内容的属性。语法是一个大致相当于if (dataByDepartment[rowData.department] != undefined)的快捷方式。

if中的第一个陈述:

dataByDepartment[rowData.department] = [];

创建一个新属性,其键名为rowData.department中的任何内容以及新空数组的值。此时如果属性已经存在,它将被新的空数组覆盖,因此if测试。

if中的第二个语句将部门名称添加到departments数组中:

departments.push(rowData.department);

最后,在if之后,dataByDepartment[rowData.department]引用的数组添加了一个新元素:

dataByDepartment[rowData.department].push(rowData);