То же выражение, но другой результат - PullRequest
0 голосов
/ 15 января 2020

Я пытался использовать простую функцию подсчета частот для Массива транспортных средств:

    const data = ['car', 'car', 'truck', 'truck', 'bike', 'walk', 'car', 'van', 'bike', 'walk', 'car', 'van', 'car', 'truck', 'airplane'];

использовались два отдельных, но похожих выражения: где оба, как мне кажется, выражены одинаково: если не в объекте это равно 0, если в obj продолжайте добавлять один. Однако функция, использующая троичный оператор, дает объект с именами транспортных средств, но все со значением 0.

1.

let sumVeh = data.reduce((obj, veh) => {
  if(!obj[veh]) obj[veh] = 0; 
  obj[veh]++;
  return obj;
}, {})

РЕЗУЛЬТАТ:

{car : 5, truck : 3, bike : 2....}

2 .

let sumVeh = data.reduce((obj, veh) => {
  !obj[veh] ? obj[veh] = 0 : obj[veh]++;
  return obj;
}, {})

РЕЗУЛЬТАТ:

{car : 0, truck : 0, bike : 0....}

Почему он это делает ?? Я просто не мог понять ... Спасибо заранее!

1 Ответ

3 голосов
/ 15 января 2020

Два выражения не эквивалентны. Выражение троичного оператора эквивалентно этому коду:

if(!obj[veh]) obj[veh] = 0;
else obj[veh]++;

Видите ли вы, как это отличается от вашей версии 1? obj[veh] увеличивается только , если это уже истинное значение . Тем не менее, до этого может быть только undefined или 0 - оба ложных значения.

Два выражения совсем не эквивалентны, так как версия 1 увеличивает obj[veh] независимо от результата if -statement, тогда как версия 2 только увеличивает obj[veh] в состоянии else.

...