Estoy tratando de usar la función de flecha ES6 con .filter
para regresar adultos (Jack & Jill). Parece que no puedo usar una declaración if.
¿Qué necesito saber para hacer esto en 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);
Mi ejemplo de trabajo de ES5:
let adults2 = family.filter(function (person) {
if (person.age > 18) { return person; }
});
javascript
ecmascript-6
higher-order-functions
Henry Zhu
fuente
fuente
Respuestas:
Las funciones de flecha permiten usar una expresión o un bloque como su cuerpo. Pasando una expresión
es equivalente al siguiente bloque
Sin embargo,
No es una expresión,
if
es una declaración. Por lo tanto, tendría que usar un bloque, si quisiera usarloif
en una función de flecha:Si bien eso resuelve técnicamente el problema, este es un uso confuso
.filter
, porque sugiere que debe devolver el valor que debe estar contenido en la matriz de salida. Sin embargo, la devolución de llamada pasada a.filter
debería devolver un valor booleano , es decir,true
ofalse
, que indica si el elemento debe incluirse en la nueva matriz o no.Entonces todo lo que necesitas es
En ES5:
fuente
false
otrue
, yaperson.age > 18
que siempre esfalse
otrue
.person
(por supuesto, no lo hace como señaló ...). Si su primera corrección realmente hiciera eso (foo => { if (person.age > 18) return person }
), obtendría el equivalente exacto de lo que OP utilizó en el código ES5. Si bien ese es un código confuso, sí funciona y RESOLVERÁ el problema.return person
forzarátrue
, y ningún retorno "volverá"undefined
, lo cual será forzadofalse
..filter
. ¿Te refieres a las funciones de flecha en general?No puede regresar implícitamente con un
if
, necesitaría las llaves:Sin embargo, se puede simplificar:
fuente
Tan simple como puedes usar
const adults = family.filter(({ age }) => age > 18 );
fuente
Aquí está mi solución para aquellos que usan
hook
; Si está enumerando elementos en su cuadrícula y desea eliminar el elemento seleccionado, puede usar esta solución.fuente