0

教程在这里: 教程:使用 JavaScript 对象编写电子表格数据

完整的代码可以在教程的最后找到。

我没有在第一个函数 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语句中发生了什么。dataByDepartment[rowData.department])是什么意思???

dataByDepartment最初是空的...这是在创建属性吗?

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

PS:我对 Javascript 还是很陌生...来自 C 编程,我总是对对象和属性的创建感到困惑...

4

2 回答 2

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' ) {

询问您是否需要更多说明:)

于 2011-08-17T04:24:17.733 回答
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已经有一个键名等于 in 的属性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);
于 2011-08-17T04:50:40.677 回答