вычисление корреляции для каждого типа события, которое происходит в наборе данных - PullRequest
0 голосов
/ 18 сентября 2018

Я переписал красноречивый код javascript, разбив его на собственное понимание, в отличие от краткой формы в книге.После запуска кода вместо моих событий поместите в мой пустой «let events = 0;»Массив и перепроверьте «! events.include (событие)», затем выполните «events.push (событие)».Я ожидаю, что события будут отправлены в мой пустой массив, но вместо этого массивы событий из данных JOURNAL помещаются в мое пустое событие, оставляя его со всеми событиями, а не одним массивом только из списка всех событий.

function journalEvents(journal) {
  let events = [];
  for (i = 0; i < journal.length; i++) {
   let entry = journal[i];
    for (j = 0; j < journal.length; j++) {
     let event = entry.events;
      if (!events.includes(event)) {
        events.push(event);
      }
    }
  }
  return events;
}

console.log(journalEvents(JOURNAL));
// Why am I getting an array in and array instead → [["carrot", "exercise", "weekend"], …]

Сильфон - это красноречивый код, который отлично работает, и я не могу найти разницу между моим собственным переписанным кодом из короткой руки.Может кто-нибудь сказать мне, почему мое не сортирует все события вместо того, чтобы помещать JOURNAL [i] .event в мой массив? ....

function journalEvents(journal) {
  let events = [];
  for (let entry of journal) {
    for (let event of entry.events) {
      if (!events.includes(event)) {
        events.push(event);
      }
    }
  }
  return events;
}

console.log(journalEvents(JOURNAL));
// This is the ectaul expected result (A single array of events) → ["carrot", "exercise", "weekend", "bread", …]

// can someone please break this code down for me line by line?

function journalEvents(journal) {

  /* how come this block could use the same name "events" as it is in the 
  JOURNAL data to set its output collections of arrays and does not affect the 
  code "JOURNAL[i].events" in the date when it loop through?. 
  Isn't that variable declaration at the begining of the loop sets the events 
  in the JOURNAL data to an empty array everytime it runs?*/
  
  let events = [];
  for (let entry of journal) {
    for (let event of entry.events) {
      if (!events.includes(event)) {
      
  /* Why are the events pushed in individually and not in their arrays? */
  
        events.push(event);
      }
    }
  }
  return events;
}


console.log(journalEvents(JOURNAL));
// → ["carrot", "exercise", "weekend", "bread", …]

1 Ответ

0 голосов
/ 18 сентября 2018

Разница между вашими двумя сценариями заключается в использовании ключевого слова of в цикле, что означает перебор значений и игнорирование ключей .

В вашем цикле выиспользуете j в качестве обозначения для клавиши, но вы не нажимаете на основе ассоциации клавиш, а вместо этого нажимаете на все значение event, где вы должны нажимать event[j], как указано ниже:

if (!events.includes(event[j])) {
    events.push(event[j]);
}

Это основано на допущении значений исходного набора данных JOURNAL, который не был представлен в вашем примере, однако в ваших комментариях внизу фрагментов достаточно того, чтобы определить причину проблемы.где JOURNAL, вероятно, будет выглядеть примерно так (чисто образованное предположение):

[
    ["carrot", "exercise", "weekend"],
    ["carrot", "exercise", "weekend"],
    // ... etc
]

Оператор of является частью спецификации ES6 , котораябыл включен для замены традиционного неуклюжего способа итерации на for ... in без включения значений прототипа , который традиционно будет выглядеть примерно так:следующее:

for (i in object)
{
    if (object.hasOwnPrototype(i))
    {
        var.push(i);
    }
}

Это, очевидно, несколько громоздко, поскольку for ... in перебирает по всем ключам, включая цепочку прототипов (где чаще всего не нужно повторять цепочку прототипов)и foreach традиционно были плохими по производительности, поэтому добавлен цикл for ... of.Если вы эмулируете это с помощью for (i=0; i < some_array.length; i++), то вам нужно явно ссылаться на значения с помощью ключа i, например object[i], который также работает только для массивов, а не для объектов, которые ассоциативно связаны со строками.for ... of работает как для любого другого объекта, подобного массиву, что делает его значительно более универсальным и в целом снижает сложность и избыточность вашего кода.

...