Путаница учебник путаница - PullRequest
0 голосов
/ 17 августа 2011

Учебное пособие находится здесь: Учебное пособие: Написание данных электронной таблицы с использованием объектов JavaScript

Полный код можно найти в конце учебного пособия.

Я не получаю цикл 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, меня всегда смущают создание объектов и свойств ...

Ответы [ 2 ]

1 голос
/ 17 августа 2011

В общих чертах функция цикла заключается в заполнении объекта dataByDepartment одним свойством для каждого (отдельного) отдела, где каждое свойство будет ссылаться на массив данных, применимых к этому отделу.Каждая итерация цикла сначала проверяет, есть ли уже свойство для текущего отдела, а если нет, то создает его.Если ему нужно создать новое свойство, он также добавляет отдел в массив departments.

Некоторый фон: следующий оператор создает объект без изначально свойств:

var dataByDepartment = {};

Чтобы назначить этому объекту свойство «key1» со значением «value1», вы должны сказать:

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);
1 голос
/ 17 августа 2011

Вы получаете там.

dataByDepartment[rowData.department]

// is the same as
var myKey = rowData.department // you can use dot or bracket notation
dataByDepartment[myKey]

Если ключ существует, то это не undefined - он оценит true .Если ключ не существует, то он равен undefined - он оценивает false

Таким образом, оператор if такой же, как этот

if ( !dataByDepartment[myKey]) {

// which is logically the same as (note that === does not coerce type)
if ( typeof(dataByDepartment[myKey]) === 'undefined' ) {

Спросите, если вам нужно больше разъяснений:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...