Выразительный 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