Как использовать 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)