Как использовать ES6 Fat Arrow для .filter() массив объектов

Я пытаюсь использовать функцию стрелок ES6 с .filter, чтобы вернуть взрослых (Джек и Джилл). Кажется, я не могу использовать оператор if.

Что мне нужно знать, чтобы сделать это в ES6?

var family = [{"name":"Jack",  "age": 26},
              {"name":"Jill",  "age": 22},
              {"name":"James", "age": 5 },
              {"name":"Jenny", "age": 2 }];

let adults = family.filter(person => if (person.age > 18) person); // throws error

(8:37) SyntaxError: unknown: Unexpected token (8:37)
|let adults = family.filter(person => if (person.age > 18) person);

Мой рабочий пример ES5:

let adults2 = family.filter(function (person) {
  if (person.age > 18) { return person; }
});

Ответ 1

Кажется, я не могу использовать оператор if.

Функции Arrow также позволяют использовать выражение или блок как их тело. Передача выражения

foo => bar

эквивалентен следующему блоку

foo => { return bar; }

Однако

if (person.age > 18) person

не является выражением, if является выражением. Следовательно, вам нужно будет использовать блок, если вы хотите использовать if в функции стрелки:

foo => {  if (person.age > 18) return person; }

Хотя это технически решает проблему, это путаное использование .filter, поскольку оно предполагает, что вы должны вернуть значение, которое должно содержаться в выходном массиве. Однако обратный вызов, переданный в .filter, должен возвращать Boolean, т.е. true или false, указывая, должен ли элемент быть включен в новый массив или нет.

Итак, все, что вам нужно, это

family.filter(person => person.age > 18);

В ES5:

family.filter(function (person) {
  return person.age > 18;
});

Ответ 2

Вы не можете неявно возвращаться с помощью if, вам нужны скобки:

let adults = family.filter(person => { if (person.age > 18) return person} );

Это может быть упрощено, хотя:

let adults = family.filter(person => person.age > 18);

Ответ 3

Столь же простой, как вы можете использовать const adults = family.filter(({ age }) => age > 18 );

const family =[{"name":"Jack",  "age": 26},
              {"name":"Jill",  "age": 22},
              {"name":"James", "age": 5 },
              {"name":"Jenny", "age": 2 }];

const adults = family.filter(({ age }) => age > 18 );

console.log(adults)