Come usare ES6 Fat Arrow per .filter () una matrice di oggetti


139

Sto cercando di utilizzare la funzione freccia ES6 con .filterper tornare adulti (Jack & Jill). Sembra che non riesca a usare un'istruzione if.

Cosa devo sapere per farlo in 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);

Il mio esempio ES5 funzionante:

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

(8:37) Sintassi Errore: sconosciuto: token imprevisto (8:37) | let adults = family.filter (person => if (person.age> 18) people);
Henry Zhu,

Risposte:


236

Sembra che non posso usare un'istruzione if.

Le funzioni freccia consentono di usare un'espressione o un blocco come corpo. Passando un'espressione

foo => bar

è equivalente al seguente blocco

foo => { return bar; }

Però,

if (person.age > 18) person

non è un'espressione, ifè un'affermazione. Quindi dovresti usare un blocco, se volessi usare ifuna funzione freccia:

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

Mentre ciò risolve tecnicamente il problema, questo è un uso confuso di .filter, perché suggerisce che è necessario restituire il valore che dovrebbe essere contenuto nell'array di output. Tuttavia, il callback passato a .filterdovrebbe restituire un valore booleano , ovvero trueo false, che indica se l'elemento deve essere incluso nel nuovo array o meno.

Quindi tutto ciò che serve è

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

In ES5:

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

Ah, che grande spiegazione. In .filter () se non viene restituito nulla per un oggetto, viene considerato falso? Ad esempio, nell'esempio ES5 vengono restituiti solo gli elementi veri.
Henry Zhu,

2
@HenryZhu: Sì. Ma il mio esempio restituisce sempre o falseo true, poiché person.age > 18è sempre falseo true.
Felix Kling,

La versione con "non bloccato" se dovesse tornare person(ovviamente non lo fa come hai indicato ...). Se la tua prima correzione lo avesse effettivamente fatto ( foo => { if (person.age > 18) return person }), otterrai esattamente l'equivalente di ciò che OP ha usato nel codice ES5. Sebbene sia un codice confuso, FUNZIONA e risolverà il problema. return personcostringerà a true, e nessun ritorno "ritornerà" undefined, a cui sarà costretto false.
Entro il

1
@Amit: certo. Ho pensato perché l'altra risposta l'ha suggerito, non avrei dovuto. Tuttavia, questo può essere fonte di confusione, quindi l'ho aggiornato.
Felix Kling,

2
@ just-boris: non sono sicuro di ciò che questo conseguirebbe qui .filter. Intendi le funzioni delle frecce in generale?
Felix Kling,

46

Non puoi implicitamente tornare con un if, avresti bisogno delle parentesi graffe:

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

Può essere semplificato però:

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

Fantastico, il secondo funziona. Il primo restituisce un array vuoto. Qualche idea?
Henry Zhu,

1
@HenryZhu: Funziona bene (probabilmente c'è qualcos'altro che non va nel tuo codice o nel tuo transpiler). Ma non è comunque il modo giusto.
Felix Kling,

1
Come si farebbe nel caso in cui tu abbia una dichiarazione else? Sto provando a vederlo con un ternario ma non riesco a identificare la sintassi corretta
Winnemucca

@stevek Esattamente come faresti con una normale funzione come nel primo esempio.
Kit Sunde,

0

Semplice come puoi usare 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

Ecco la mia soluzione per coloro che usano hook; Se stai elencando elementi nella griglia e desideri rimuovere l'elemento selezionato, puoi utilizzare questa soluzione.

var list = data.filter(form => form.id !== selectedRowDataId);
setData(list);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.