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


139

我正在尝试使用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; }
});

(8:37)语法错误:未知:意外的令牌(8:37)|让大人= family.filter(person => if(person.age> 18)people);
朱朱

Answers:


236

看来我不能使用if语句。

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

foo => bar

等效于以下块

foo => { return bar; }

然而,

if (person.age > 18) person

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

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

虽然从技术上来说可以解决问题,但是对的使用.filter却令人困惑,因为它建议您必须返回应包含在输出数组中的值。然而,回调传递给.filter应返回一个布尔,即true或者false,指示元素是否应包含新阵列中或没有。

所以你需要的是

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

在ES5中:

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

啊,真是个不错的解释。在.filter()中,如果对象未返回任何内容,则假定为false?例如,在您的ES5示例中,仅返回true元素。
朱朱

2
@HenryZhu:是的。但是我的示例始终返回falseor true,因为person.age > 18始终为falseor true
Felix Kling

如果带有“ un-blocked”的版本应该返回person(当然,它不会像您所指出的那样执行此操作……)。如果您的第一个更正实际上是完成了(foo => { if (person.age > 18) return person }),您将获得与ES5代码中所用OP完全相同的信息。虽然这是一个令人困惑的代码,但它确实起作用,并且将解决问题。return person将强制执行true,并且没有返回将“ undefined强制返回” false
阿米特(Amit)2015年

1
@Amit:好的。我以为,因为其他答案都建议这样做,所以我不必这样做。但是,这可能会造成混淆,因此我对其进行了更新。
菲利克斯·克林

2
@ just-boris:不确定可以在这里实现什么.filter。您是说箭头功能吗?
菲利克斯·克林

45

您不能使用隐式返回if,而是需要大括号:

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

可以简化:

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

太棒了,第二个作品。第一个返回一个空数组。有任何想法吗?
朱朱

1
@HenryZhu:它可以正常工作(您的代码或编译器可能存在其他问题)。但这毕竟不是正确的方法。
Felix Kling

1
如果您有else语句,该怎么办?我试图用三元数看这件事,但似乎无法识别正确的语法
Winnemucca

@stevek与第一个示例中的普通函数完全一样。
Kit Sunde

0

尽可能简单地使用 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)


0

这是我为那些使用的人的解决方案hook;如果要在网格中列出项目,并且想要删除所选项目,则可以使用此解决方案。

var list = data.filter(form => form.id !== selectedRowDataId);
setData(list);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.