2013-02-17 112 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