2011-08-17 43 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