2017-09-12 10 views
6

Utworzono funkcję "filtru", która odbiera tablicę obiektów. Każdy obiekt ma właściwość accountId. Moja funkcja ma na celu odfiltrowanie obiektów, które mają inny accountId. Pchnie tam jednak obiekt undefined.Funkcja wyszukiwania JS nieokreślona

Co jest nie tak z moją funkcją?

export const filterItems = (myArray, accountId) => { 

    let filteredItems = []; 
    filteredItems.push(myArray.find(items => items.accountId === accountId)); 

    return filteredItems; 
} 

Kiedy zdać accountId do mojej funkcji, które nie są w tablicy, to wyjście jest tablicą z jednej pozycji w nim, a pozycja jest niezdefiniowana - patrz poniżej:

[ 
    0: undefined 
] 

Co czy robię źle?

+0

Na marginesie: Dlaczego twoja funkcja zwraca _Array_, o nazwie filtersItem ** s **, jeśli masz zamiar zwrócić tylko jeden element lub żaden? Przynajmniej to robi 'Array.prototype.find()'. Może chciałeś zrobić 'return myArray.filter (...);'? – blex

+0

Chcę zwrócić wszystkie elementy, których 'accountId' odpowiada wartości określonej w parametrze. W rezultacie może to być więcej niż jeden obiekt. Jeśli żaden z obiektów nie ma pasującego 'accountId', chcę zwrócić pustą tablicę. – Sam

+0

Następnie przejdź do odpowiedzi @ Niny. Jest to jedyny, który zwróci wiele elementów, jeśli pasują, oraz pustą tablicę, jeśli żadna nie zostanie wykonana. – blex

Odpowiedz

3

Można po prostu przefiltrować tablicę i zwrócić pustą tablicę, jeśli nie znaleziono.

export const filterItems = (myArray, accountId) => 
    myArray.filter(items => items.accountId === accountId); 
3

Twój kod zawsze wywołuje funkcję .push(). Funkcja .find() zwraca wartość undefined, jeśli element nie zostanie znaleziony.

można pobrać wartości zwracanej od .find() a następnie wcisnąć tylko wynik, kiedy to faktycznie znaleziono:

let filteredItems = []; 
let item = myArray.find(items => items.accountId === accountId); 
if (item !== undefined) 
    filteredItems.push(item); 
return filteredItems; 
3

myArray.find(items => items.accountId === accountId) wraca undefined (i to jest popychany do filteredItems)

Spróbuj to zamiast :

//... 
let item = myArray.find(items => items.accountId === accountId); 

if(item) { 
    filteredItems.push(item); 
} 
//... 
Powiązane problemy