В общих чертах функция цикла заключается в заполнении объекта 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);