如何使用 ES6 胖箭头来 .filter() 对象数组

我正在尝试使用ES6箭头函数来返回成年人(Jack & Jill)。看来我不能使用 if 语句。.filter

为了在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 语句。

箭头函数允许使用表达式作为其主体。传递表达式

foo => bar

等效于以下块

foo => { return bar; }

然而

if (person.age > 18) person

不是表达式,而是语句。因此,如果你想在箭头函数中使用,你必须使用一个块:ifif

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

虽然这在技术上解决了问题,但这是一个令人困惑的使用,因为它建议您必须返回应包含在输出数组中的值。但是,传递给的回调应返回一个布尔值,即 或 ,指示该元素是否应包含在新数组中。.filter.filtertruefalse

所以你所需要的只是

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);