Próbuję użyć funkcji strzałki ES6 w .filter
celu zwrócenia dorosłych (Jack i Jill). Wygląda na to, że nie mogę użyć instrukcji if.
Co muszę wiedzieć, aby to zrobić w 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);
Mój działający przykład ES5:
let adults2 = family.filter(function (person) {
if (person.age > 18) { return person; }
});
javascript
ecmascript-6
higher-order-functions
Henry Zhu
źródło
źródło
Odpowiedzi:
Strzałka funkcje albo umożliwić użycie wyrażenia lub do bloku , jak ich ciała. Przekazywanie wyrazu
odpowiada następnemu blokowi
Jednak,
nie jest wyrażeniem,
if
jest stwierdzeniem. Dlatego musiałbyś użyć bloku, gdybyś chciał użyćif
w funkcji strzałkowej:Chociaż technicznie rozwiązuje to problem, jest to mylące użycie
.filter
, ponieważ sugeruje, że musisz zwrócić wartość, która powinna być zawarta w tablicy wyjściowej. Jednak wywołanie zwrotne przekazane do.filter
powinno zwrócić wartość logiczną , tj.true
Orfalse
, wskazującą, czy element powinien zostać uwzględniony w nowej tablicy, czy nie.Więc wszystko, czego potrzebujesz, to
W ES5:
źródło
false
albotrue
, ponieważperson.age > 18
zawsze jest albofalse
albotrue
.person
(oczywiście nie robi tego, jak wskazałeś ...). Gdyby Twoja pierwsza korekta faktycznie to zrobiła (foo => { if (person.age > 18) return person }
), dostałbyś dokładny odpowiednik tego, co zostało użyte w kodzie ES5. Chociaż jest to mylący kod, DZIAŁA i rozwiąże problem.return person
będzie zmuszaćtrue
i żaden powrót nie „powróci”undefined
, do czego zostanie zmuszonyfalse
..filter
. Czy ogólnie masz na myśli funkcje strzałek?Nie możesz niejawnie powrócić z
if
, potrzebujesz nawiasów klamrowych:Można to jednak uprościć:
źródło
Tak proste, jak tylko możesz
const adults = family.filter(({ age }) => age > 18 );
źródło
Oto moje rozwiązanie dla tych, którzy używają
hook
; Jeśli wystawiasz przedmioty w swojej siatce i chcesz usunąć wybrany przedmiot, możesz skorzystać z tego rozwiązania.źródło