Задача из книги Выразительный Javascript

318
12 апреля 2017, 15:01

Всем привет. Сейчас осваиваю Javascript через книгу "Выразительный javascript". Там есть раздел объекты. И пример про белку - оборотня. (Да-да именно про оборотня)

Указан вот такой код

var JOURNAL = [ 
    { "events": ["carrot", "exercise", "weekend"], "squirrel": false }, 
    { "events": ["bread", "pudding", "brushed teeth", "weekend", "touched tree"], "squirrel": false }, 
    { "events": ["carrot", "nachos", "brushed teeth", "cycling", "weekend"], "squirrel": false }, 
    { "events": ["brussel sprouts", "ice cream", "brushed teeth", "computer", "weekend"], "squirrel": false }, 
    { "events": ["potatoes", "candy", "brushed teeth", "exercise", "weekend", "dentist"], "squirrel": false }, 
    { "events": ["brussel sprouts", "pudding", "brushed teeth", "running", "weekend"], "squirrel": false }, 
    { "events": ["pizza", "brushed teeth", "computer", "work", "touched tree"], "squirrel": false }, 
    { "events": ["bread", "beer", "brushed teeth", "cycling", "work"], "squirrel": false }, 
    { "events": ["cauliflower", "brushed teeth", "work"], "squirrel": false }, 
    { "events": ["pizza", "brushed teeth", "cycling", "work"], "squirrel": false }, 
    { "events": ["lasagna", "nachos", "brushed teeth", "work"], "squirrel": false }, 
    { "events": ["brushed teeth", "weekend", "touched tree"], "squirrel": false }, 
    { "events": ["lettuce", "brushed teeth", "television", "weekend"], "squirrel": false }, 
    { "events": ["spaghetti", "brushed teeth", "work"], "squirrel": false }, 
    { "events": ["brushed teeth", "computer", "work"], "squirrel": false }, 
    { "events": ["lettuce", "nachos", "brushed teeth", "work"], "squirrel": false }, 
    { "events": ["carrot", "brushed teeth", "running", "work"], "squirrel": false }, 
    { "events": ["brushed teeth", "work"], "squirrel": false }, 
    { "events": ["cauliflower", "reading", "weekend"], "squirrel": false }, 
    { "events": ["bread", "brushed teeth", "weekend"], "squirrel": false }, 
    { "events": ["lasagna", "brushed teeth", "exercise", "work"], "squirrel": false }, 
    { "events": ["spaghetti", "brushed teeth", "reading", "work"], "squirrel": false }, 
    { "events": ["carrot", "ice cream", "brushed teeth", "television", "work"], "squirrel": false }, 
    { "events": ["spaghetti", "nachos", "work"], "squirrel": false }, 
    { "events": ["cauliflower", "ice cream", "brushed teeth", "cycling", "work"], "squirrel": false }, 
    { "events": ["spaghetti", "peanuts", "computer", "weekend"], "squirrel": true }, 
    { "events": ["potatoes", "ice cream", "brushed teeth", "computer", "weekend"], "squirrel": false }, 
    { "events": ["potatoes", "ice cream", "brushed teeth", "work"], "squirrel": false }, 
    { "events": ["peanuts", "brushed teeth", "running", "work"], "squirrel": false }, 
    { "events": ["potatoes", "exercise", "work"], "squirrel": false }, 
    { "events": ["pizza", "ice cream", "computer", "work"], "squirrel": false }, 
    { "events": ["lasagna", "ice cream", "work"], "squirrel": false }, 
    { "events": ["cauliflower", "candy", "reading", "weekend"], "squirrel": false }, 
    { "events": ["lasagna", "nachos", "brushed teeth", "running", "weekend"], "squirrel": false }, 
    { "events": ["potatoes", "brushed teeth", "work"], "squirrel": false }, 
    { "events": ["carrot", "work"], "squirrel": false }, 
    { "events": ["pizza", "beer", "work", "dentist"], "squirrel": false }, 
    { "events": ["lasagna", "pudding", "cycling", "work"], "squirrel": false }, 
    { "events": ["spaghetti", "brushed teeth", "reading", "work"], "squirrel": false }, 
    { "events": ["spaghetti", "pudding", "television", "weekend"], "squirrel": false }, 
    { "events": ["bread", "brushed teeth", "exercise", "weekend"], "squirrel": false }, 
    { "events": ["lasagna", "peanuts", "work"], "squirrel": true }, 
    { "events": ["pizza", "work"], "squirrel": false }, 
    { "events": ["potatoes", "exercise", "work"], "squirrel": false }, 
    { "events": ["brushed teeth", "exercise", "work"], "squirrel": false }, 
    { "events": ["spaghetti", "brushed teeth", "television", "work"], "squirrel": false }, 
    { "events": ["pizza", "cycling", "weekend"], "squirrel": false }, 
    { "events": ["carrot", "brushed teeth", "weekend"], "squirrel": false }, 
    { "events": ["carrot", "beer", "brushed teeth", "work"], "squirrel": false }, 
    { "events": ["pizza", "peanuts", "candy", "work"], "squirrel": true }, 
    { "events": ["carrot", "peanuts", "brushed teeth", "reading", "work"], "squirrel": false }, 
    { "events": ["potatoes", "peanuts", "brushed teeth", "work"], "squirrel": false }, 
    { "events": ["carrot", "nachos", "brushed teeth", "exercise", "work"], "squirrel": false }, 
    { "events": ["pizza", "peanuts", "brushed teeth", "television", "weekend"], "squirrel": false }, 
    { "events": ["lasagna", "brushed teeth", "cycling", "weekend"], "squirrel": false }, 
    { "events": ["cauliflower", "peanuts", "brushed teeth", "computer", "work", "touched tree"], "squirrel": false }, 
    { "events": ["lettuce", "brushed teeth", "television", "work"], "squirrel": false }, 
    { "events": ["potatoes", "brushed teeth", "computer", "work"], "squirrel": false }, 
    { "events": ["bread", "candy", "work"], "squirrel": false }, 
    { "events": ["potatoes", "nachos", "work"], "squirrel": false }, 
    { "events": ["carrot", "pudding", "brushed teeth", "weekend"], "squirrel": false }, 
    { "events": ["carrot", "brushed teeth", "exercise", "weekend", "touched tree"], "squirrel": false }, 
    { "events": ["brussel sprouts", "running", "work"], "squirrel": false }, 
    { "events": ["brushed teeth", "work"], "squirrel": false }, 
    { "events": ["lettuce", "brushed teeth", "running", "work"], "squirrel": false }, 
    { "events": ["candy", "brushed teeth", "work"], "squirrel": false }, 
    { "events": ["brussel sprouts", "brushed teeth", "computer", "work"], "squirrel": false }, 
    { "events": ["bread", "brushed teeth", "weekend"], "squirrel": false }, 
    { "events": ["cauliflower", "brushed teeth", "weekend"], "squirrel": false }, 
    { "events": ["spaghetti", "candy", "television", "work", "touched tree"], "squirrel": false }, 
    { "events": ["carrot", "pudding", "brushed teeth", "work"], "squirrel": false }, 
    { "events": ["lettuce", "brushed teeth", "work"], "squirrel": false }, 
    { "events": ["carrot", "ice cream", "brushed teeth", "cycling", "work"], "squirrel": false }, 
    { "events": ["pizza", "brushed teeth", "work"], "squirrel": false }, 
    { "events": ["spaghetti", "peanuts", "exercise", "weekend"], "squirrel": true }, 
    { "events": ["bread", "beer", "computer", "weekend", "touched tree"], "squirrel": false }, 
    { "events": ["brushed teeth", "running", "work"], "squirrel": false }, 
    { "events": ["lettuce", "peanuts", "brushed teeth", "work", "touched tree"], "squirrel": false }, 
    { "events": ["lasagna", "brushed teeth", "television", "work"], "squirrel": false }, 
    { "events": ["cauliflower", "brushed teeth", "running", "work"], "squirrel": false }, 
    { "events": ["carrot", "brushed teeth", "running", "work"], "squirrel": false }, 
    { "events": ["carrot", "reading", "weekend"], "squirrel": false }, 
    { "events": ["carrot", "peanuts", "reading", "weekend"], "squirrel": true }, 
    { "events": ["potatoes", "brushed teeth", "running", "work"], "squirrel": false }, 
    { "events": ["lasagna", "ice cream", "work", "touched tree"], "squirrel": false }, 
    { "events": ["cauliflower", "peanuts", "brushed teeth", "cycling", "work"], "squirrel": false }, 
    { "events": ["pizza", "brushed teeth", "running", "work"], "squirrel": false }, 
    { "events": ["lettuce", "brushed teeth", "work"], "squirrel": false }, 
    { "events": ["bread", "brushed teeth", "television", "weekend"], "squirrel": false }, 
    { "events": ["cauliflower", "peanuts", "brushed teeth", "weekend"], "squirrel": false } 
]; 
 
 
function hasEvent(event, entry) { 
    return entry.events.indexOf(event) != -1; 
} 
 
function tableFor(event, journal) { 
    var table = [0, 0, 0, 0]; 
 
    for (var i = 0; i < journal.length; i++) { 
       
        var entry = journal[i], 
            index = 0; 
 
        if (hasEvent(event, entry)) { 
            index += 1; 
        } 
 
        if (entry.squirrel) { 
            index += 2; 
        } 
 
        table[index] += 1; 
    } 
    return table; 
} 
 
console.log(tableFor("pizza", JOURNAL));

Я никак не могу понять как он заполняет массив table. Пожалуйста, если кто может - распишите по подробнее. Заранее огромное спасибо!

Answer 1

Добавлю код комментариями, думаю так будет понятней, хотя мог где то и не правильно выразиться, уточняйте если что:

//Функция которая проверяет есть ли в элементе массива значение event, в данном случае pizza
//Для случая { "events": ["pizza", "brushed teeth", "work"], "squirrel": false } вернет true
//Для случая { "events": ["spaghetti", "peanuts", "exercise", "weekend"], "squirrel": true }, вернет false
function hasEvent(event, entry) {
    return entry.events.indexOf(event) != -1;
}
function tableFor(event, journal) {
    // Результат, в 1 элемент записывает если "squirrel": false и нет значения pizza в массиве events
    // в 2 элемент заносятся данные если есть значение pizza в массиве events
    // в 3 элемент заносятся данные если значение "squirrel": true
    // в 4 элемент заносятся данные если есть "squirrel": true и значение pizza в массиве events
    // Думаю это описано в самой книге
    var table = [0, 0, 0, 0];
    // Проходимся циклом по массиву JOURNAL по каждому элементу массива
    for (var i = 0; i < journal.length; i++) {
        //entry - это элемент массива, к примеру - { "events": ["carrot", "exercise", "weekend"], "squirrel": false },
        var entry = journal[i],
            index = 0;
        //Работу функции описал выше, если нашел pizza тогда index = 1
        if (hasEvent(event, entry)) {
            index += 1;
        }
        //Проверяет есть ли в { "events": ["carrot", "exercise", "weekend"], "squirrel": false }, значение squirrel - true
        //Если true добавляем к index + 2, в итоге может получиться index = 2 или index = 3 если нашли в events pizza
        if (entry.squirrel) {
            index += 2;
        }
        //Добавляем 1 в таблицу с полученным index
        table[index] += 1;
    }
    return table;
}

В итоге получается что:

76 элементов массива без squirrel = true и без pizza в events

9 элементов массива в которых в массиве events есть pizza и при этом squirrel = false

4 элемента массива в которых в массиве events нет pizza, но squirrel = true

1 элемент массива в котором в массиве events есть pizza и squirrel = true

Answer 2
// Сначала table это массив из четырех нулей [0, 0, 0, 0]
// Итерация 1:
i == 0;
entry == { "events": ["carrot", "exercise", "weekend"], "squirrel": false };
index == 0;
if (["carrot", "exercise", "weekend"].indexOf("pizza") != -1) { // false, "pizza" нет в первом JOURNAL.events
   index += 1; // index == 0
}
if (entry.squirrel) { // false, entry.squirrel == false
   index += 2; // index == 0
}
table[0] += 1; // 1, table == [1,0,0,0]
// Итерация 2:
i == 1;
entry == { "events": ["bread", "pudding", "brushed teeth", "weekend", "touched tree"], "squirrel": false };
index == 0;
if (["bread", "pudding", "brushed teeth", "weekend", "touched tree"].indexOf("pizza") != -1) { // false, "pizza" нет во втором JOURNAL.events
   index += 1; // index == 0
}
if (entry.squirrel) { // false, entry.squirrel == false
   index += 2; // index == 0
}
table[0] += 1; // 2, table == [2,0,0,0]
// ...
// Итерация 7:
i == 6;
entry == { "events": ["pizza", "brushed teeth", "computer", "work", "touched tree"], "squirrel": false };
index == 0;
if (["pizza", "brushed teeth", "computer", "work", "touched tree"].indexOf("pizza") != -1) { // true, "pizza" есть в JOURNAL.events
   index += 1; // index == 1
}
if (entry.squirrel) { // false, entry.squirrel == false
   index += 2; // index == 1
}
table[1] += 1; // 1, table == [6,1,0,0]
// ...
// и далее не находит "pizza" и squirrel == false -- растёт 0 элемент table,
// находит "pizza", но squirrel == false -- растёт 1-й элемент table,
// squirrel == true, но pizza не находит -- растёт 2-й элемент table,
// находит pizza и squirrel == true -- растёт 3-й элемент table
READ ALSO
Statement, Expression, ExpressionStatements. Отличие и корректный перевод

Statement, Expression, ExpressionStatements. Отличие и корректный перевод

Столкнулся с понятиями Statement, Expression, ExpressionStatements в книге Douglas CrockfordJavaScript: The Good Parts

234
Как убрать ошибку JS в PHPMyAdmin?

Как убрать ошибку JS в PHPMyAdmin?

Установил новую версию PHPMyAdminВ целом все OK, но в консоли вылезает ошибка JS:

245
как уменьшить простой блок кода if else

как уменьшить простой блок кода if else

Есть страничка с высотой 4600 пикселей и есть блок кода которое при скролле плавно приближает элементов справа налево или наоборот, но код...

206