2013-02-17 24 views
1

我在這裏創建了一個腳本,它創建了一個對象構造函數,然後buildList()從電子表格中獲取數據並且吐出一個包含部門名稱的數組。我在buildObjects()中試圖做的是使用該數組爲每個部門創建一個對象,然後用與部門有關的各種值填充它。很顯然,我有與線var ADCnames[i] = new ADC(ADCnames[i]);如何使用數組值作爲變量名?

function ADC(name) { 
    this.name = name; 
} 

function buildObjects() { 
    var ADCnames = buildList('ADC', 1); 
    var ADCarray = []; 
    for (var i in ADCnames) { 
    var ADCnames[i] = new ADC(ADCnames[i][0]); 
    ADCarray.push(<<the variable I just created>>); 
    } 
    return ADCarray; 
} 

我是新來使用對象,所以有可能是我缺少一個簡單的方法麻煩。任何幫助表示讚賞。

+1

東西它是值得的,它有時是值得不使用「名稱」作爲atrribute因爲它可以是一個保留字。並不總是一個問題,但可能會導致難以調試線路上的問題。 http://www.quackit.com/javascript/javascript_reserved_words.cfm – Jonathon 2013-02-18 16:18:11

+0

謝謝你的提高,我改變了它。 – 2013-02-18 16:33:08

回答

2

您只需重命名變量即可。

嘗試

function buildObjects() { 
    var ADCnames = buildList('ADC', 1); 
    var ADCarray = []; 
    for (var i in ADCnames) { 
    var tempADC = new ADC(ADCnames[i][0]); 
    //do whatever else you need to do to this object. 
    ADCarray.push(tempADC); 
    } 
    return ADCarray; 
} 
+0

這種方法的問題是,我將有11個對象的所有命名tempADC,我該如何去約一個屬性那11個?使用上面答案中的示例:我想知道存儲在Department屬性中存儲Math的對象的teacher屬性中的內容。 – 2013-02-18 13:05:15

+1

tempADC只是變量名稱。它對物體本身沒有影響。如果你看一下這個代碼後ADC陣列,它看起來是這樣的:'[{名:「名稱1」},{名稱:「NAME2」},... {名:「name11」}]' 。 – 2013-02-18 13:11:26

+0

權,讓我們說,我想使用'{名:「名稱1」}對象'另一個函數,並在該函數中我做一個計算,我想結果存儲爲一個新的屬性在對象與'{ name:「name1」}',我如何引用該對象來分配新屬性?我必須使用數組索引還是可以以某種方式使用name屬性? – 2013-02-18 13:28:53

1

對象屬性可以通過點符號,或支架符號(如陣列)被分配

因此,嘗試這個代替:

此[名稱] =名;

您不會得到部門名稱的「變量」,但部門數組將以部門爲屬性的對象。這是你想要的,如果部門名稱永遠是唯一的,你可能不需要該廁所的數組。

更新

要在我的觀點擴大上述關於非需要額外的數組。因爲你正在處理(我假設)獨特的部門名稱,這些可能是關鍵。

所以:

function buildDepartments() { 

    var departmentList = SpreadsheetApp.getActiveSpreadsheet().getRange('a1:c2').getValues(), // Assuming a 3 column list with, say: department name, department head, department deputy. 
     departments = {}, 
     d; 

    for (d = 0; d < departmentList.length; d += 1) { 
    departments[departmentList[d][0]] = {head: departmentList[d][1], deputy: departmentList[d][2]}; 
    } 

    // To recall the department details ... however many there are 
    Logger.log(departments['Math'].head); // Logs the head of the Math department 
} 

,但是,它可能會更有意義,不打領帶自己陷入彷彿部門名稱變化,它會是一個麻煩,使變化,可能隨時間而改變的密鑰。如果您「指定」了對象,那麼使用ScriptDB也會更容易。 這樣:

function buildDepartments() { 

    // Assuming a 3 column list with, say: name, head, deputy. 
    var departmentList = SpreadsheetApp.getActiveSpreadsheet().getRange('a1:c2').getValues(), 
     departments = [], // Now this an array 
     d; 

    for (d = 0; d < departmentList.length; d += 1) { 
    departments.push({ 
     title: departmentList[d][0], 
     head: departmentList[d][1], 
     deputy: departmentList[d][2] 
    }); 
    } 

    // To recall the department details ... however many there are 
    // Logs the head of the Math department by filtering the array to a single entry 
    Logger.log(departments.filter(function (d) { return d.title = 'Math'; })[0]); 
} 

在這一點上,並把事情一點就召回部門陣列可能是一個構造函數對象再次更加直觀。因此:

function DepartmentList() { 
    var list = []; 
    this.addDepartment = function (dept) { 
    list.push({ title: dept[0], head: dept[1], deputy: dept[2] }); 
    return this; // for chaining reasons, if you like. 
    } 
    this.getDepartment() = function(dept) { 
    var foundDepartment = list.filter(function (d) { return d.title = dept; }); 
    return foundDepartment[0] || {}; // empty object if no department match 
    } 
    return list; // bare calls to the object returns the whole list 
} 

function buildDepartments() { 
var departments = SpreadsheetApp.getActiveSpreadsheet().getRange('a1:c2').getValues(), 
    departmentList = new DepartmentList(), // Now this an object again 
    d; 

    departments.forEach(departmentList.addDepartment(entry)); // Possible because GAS supports ECMAScript5 

    // To recall the department details ... however many there are 
    // Logs the head of the Math department 
    Logger.log(departmentList.getDepartment('Math').head); 
} 

後者梅託德才會開始到意義,如果輸入數據是更廣泛的或通過對象的功能需要的任何處理。對於我所說的例子來說,這可能是過度的。

+0

在這種情況下,我將如何使用部門屬性作爲參考來拉出對象中的其他屬性?例如,我需要知道數學系的老師是誰。 – 2013-02-18 13:01:17

+0

你可以在數組樣式調用上點鏈。再次,我想你可以跳過這裏的一個數組,然後使用一個地圖對象。因此假設有一點重寫(我可能會發表一個不同的答案),你可以使用ADC ['math']。頭' – Jonathon 2013-02-18 16:10:43

+0

如果我可以標記兩個答案是正確的,我會有,因爲你也是非常有幫助的。謝謝。 – 2013-02-18 16:32:39