如何使用ES6 Fat Arrow来.filter()一个对象数组

Hen*_*Zhu 127 javascript higher-order-functions ecmascript-6

我正在尝试使用ES6箭头功能.filter来回归成年人(Jack&Jill).看来我不能使用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);
Run Code Online (Sandbox Code Playgroud)

我工作的ES5示例:

let adults2 = family.filter(function (person) {
  if (person.age > 18) { return person; }
});
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 216

看来我不能使用if语句.

箭头功能或者允许使用一个表达式 作为他们的身体.传递表达

foo => bar
Run Code Online (Sandbox Code Playgroud)

相当于以下块

foo => { return bar; }
Run Code Online (Sandbox Code Playgroud)

然而,

if (person.age > 18) person
Run Code Online (Sandbox Code Playgroud)

不是表达,if是一种陈述.因此,如果要if在箭头函数中使用,则必须使用块:

foo => {  if (person.age > 18) return person; }
Run Code Online (Sandbox Code Playgroud)

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

所以你需要的只是

family.filter(person => person.age > 18);
Run Code Online (Sandbox Code Playgroud)

在ES5中:

family.filter(function (person) {
  return person.age > 18;
});
Run Code Online (Sandbox Code Playgroud)

  • @HenryZhu:是的.但是我的例子总是返回`false`或`true`,因为`person.age> 18`总是`false`或`true`. (2认同)
  • @ just-boris:不知道这会用`.filter`实现什么.你的意思是箭头功能吗? (2认同)

Kit*_*nde 42

你不能隐含地返回if,你需要大括号:

let adults = family.filter(person => { if (person.age > 18) return person} );
Run Code Online (Sandbox Code Playgroud)

它可以简化:

let adults = family.filter(person => person.age > 18);
Run Code Online (Sandbox Code Playgroud)


小智 5

return arrayname.filter((rec) => rec.age > 18)
Run Code Online (Sandbox Code Playgroud)

将其写入方法中并调用它