Estou tentando usar a função de seta ES6 .filter
para retornar adultos (Jack & Jill). Parece que não posso usar uma instrução if.
O que eu preciso saber para fazer isso no 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);
Meu exemplo de trabalho do ES5:
let adults2 = family.filter(function (person) {
if (person.age > 18) { return person; }
});
javascript
ecmascript-6
higher-order-functions
Henry Zhu
fonte
fonte
Respostas:
As funções de seta permitem usar uma expressão ou um bloco como corpo. Passando uma expressão
é equivalente ao seguinte bloco
Contudo,
não é uma expressão,
if
é uma afirmação. Portanto, você teria que usar um bloco, se quisesse usarif
em uma função de seta:Embora isso resolva tecnicamente o problema, esse é um uso confuso
.filter
, pois sugere que você deve retornar o valor que deve estar contido na matriz de saída. No entanto, o retorno de chamada passado para.filter
deve retornar um booleano ,true
ou sejafalse
, indicando se o elemento deve ser incluído na nova matriz ou não.Então tudo que você precisa é
No ES5:
fonte
false
outrue
, já queperson.age > 18
é sempre umfalse
ou outrotrue
.person
(é claro que não faz isso como você apontou ...). Se a sua primeira correção realmente fizesse isso (foo => { if (person.age > 18) return person }
), você obteria o equivalente exato do OP usado no código ES5. Embora esse seja um código confuso, ele funciona e resolverá o problema.return person
coagirátrue
e nenhum retorno "retornará"undefined
, o que será coagidofalse
..filter
. Você quer dizer funções de seta em geral?Você não pode retornar implicitamente com um
if
, seria necessário o aparelho:No entanto, pode ser simplificado:
fonte
Tão simples quanto você pode usar
const adults = family.filter(({ age }) => age > 18 );
fonte
Aqui está a minha solução para quem usa
hook
; Se você estiver listando itens em sua grade e quiser remover o item selecionado, poderá usar esta solução.fonte