2011-08-17 46 views
0

本教程是在这里:Tutorial: Writing Spreadsheet data using JavaScript Objects应用脚本教程混乱

完整的代码可以在本教程的末尾。

我不明白的for循环的第一个函数,runExample()

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); 
    } 

我不明白什么是如果语句来内部发生的。 这是什么意思dataByDepartment [rowData.department]) ???

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

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

PS:我还是比较新的JavaScript ...从C语言编程,我总是由对象和属性的创作困惑......

回答

1

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

一些背景资料:下面的语句与最初没有属性创建一个对象:

var dataByDepartment = {}; 

要分配财产“KEY1”,其值为“值1”到该对象,那么你会说:

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); 
+0

很好的解释。真的走了一步一步。完全理解。多谢兄弟! – CppLearner

1

如果您听到那里传来。

dataByDepartment[rowData.department] 

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

如果那么关键存在,它不是未定义 - 它会评估真正。如果该键不存在,那么它是未定义 - 它会评估

所以if语句是一样的,因为这

if (!dataByDepartment[myKey]) { 

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

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

+1

如果密钥不存在,则它是'未定义的',而不是'空',尽管当然这仍然评估为错误。 'undefined == null'是真的,但是'undefined === null'是错误的。 – nnnnnn

+0

感谢您的简短介绍和解释。简洁。干得好:)谢谢很多马丁。 – CppLearner

+1

@nnnnnn你是对的。对不起,我没有注意(将编辑) – martin