教程在这里: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编程我总是对对象和属性创作感到困惑......
答案 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);