Выразительный JavaScript (Хавербеке) - страница 39

Объекты как карты (map)

Один из способов – хранить корреляции в массиве, используя объекты со свойствами >name и >value. Однако поиск корреляций в массиве будет довольно громоздким: нужно будет пройтись по всему массиву, чтобы найти объект с нужным именем. Можно было бы обернуть этот процесс в функцию, но код пришлось бы писать всё равно, и компьютер выполнял бы больше работы, чем необходимо.

Способ лучше – использовать свойства объектов с именами событий. Мы можем использовать квадратные скобки для создания и чтения свойств и оператор >in для проверки существования свойства.

>var map = {};

>function storePhi(event, phi) {

>  map[event] = phi;

>}


>storePhi("пицца", 0.069);

>storePhi("тронул дерево", -0.081);

>console.log("пицца" in map);

>// → true

>console.log(map["тронул дерево"]);

>// → -0.081

Карта (map) – способ связать значения из одной области (в данном случае – названия событий) со значениями в другой (в нашем случае – коэффициенты ϕ).

С таким использованием объектов есть пара проблем – мы обсудим их в главе 6, но пока волноваться не будем.

Что, если нам надо собрать все события, для которых сохранены коэффициенты? Они не создают предсказуемую последовательность, как было бы в массиве, поэтому цикл >for использовать не получится. JavaScript предлагает конструкцию цикла специально для обхода всех свойств объекта. Она похожа на цикл >for, но использует команду >in.

>for (var event in map)

>  console.log("Корреляция для '" + event

>              "' получается " + map[event]);

>// → Корреляция для 'пицца' получается 0.069

>// → Корреляция для 'тронул дерево' получается -0.081

Итоговый анализ

Чтобы найти все типы событий, представленных в наборе данных, мы обрабатываем каждое вхождение по очереди, и затем создаём цикл по всем событиям вхождения. Мы храним объект >phis, в котором содержатся корреляционные коэффициенты для всех типов событий, которые мы уже нашли. Если мы встречаем новый тип, которого ещё не было в >phis, мы подсчитываем его корреляцию и добавляем её в объект.

>function gatherCorrelations(journal) {

>  var phis = {};

>  for (var entry = 0; entry < journal.length; entry++) {

>    var events = journal[entry].events;

>    for (var i = 0; i < events.length; i++) {

>      var event = events[i];

>      if (!(event in phis))

>        phis[event] = phi(tableFor(event, journal));

>    }

>  }

>  return phis;

>}


>var correlations = gatherCorrelations(JOURNAL);

>console.log(correlations.пицца);

>// → 0.068599434

Смотрим, что получилось:

>for (var event in correlations)

>  console.log(event + ": " + correlations[event]);

>// → морковка:   0.0140970969