Выразительный JavaScript | страница 41



Способ лучше – использовать свойства объектов с именами событий. Мы можем использовать квадратные скобки для создания и чтения свойств и оператор >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

>// → упражнения: 0.0685994341

>// → выходной:   0.1371988681

>// → хлеб:      -0.0757554019

>// → пудинг:    -0.0648203724

>// и так далее...

Большинство корреляций лежат близко к нулю. Морковки, хлеб и пудинг, очевидно, не связаны с обращением в белку. Но оно вроде бы более часто происходит на выходных. Давайте отфильтруем результаты, чтобы выводить только корреляции больше 0,1 или меньше -0,1