Разница между вашими двумя сценариями заключается в использовании ключевого слова 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
работает как для любого другого объекта, подобного массиву, что делает его значительно более универсальным и в целом снижает сложность и избыточность вашего кода.