2015-08-10 19 views
5

poproszono mnie, aby odfiltrować NaN, null, 0, fałszywy w tablicy.Jak filtrować() z NaN, null, 0, false w tablicy (JS)

Na szczęście odpowiedziałem na pytanie.

function bouncer(arr) { 
    function filterer(arr) { 
    return arr > 0|| isNaN(arr) === true; 
    } 
    arr = arr.filter(filterer); 
    return arr; 
} 

//example input 
bouncer([0, 1, 2, 3, 'ate', '', false]); //output [1, 2, 3, 'ate'] 

Ale chodzi o to, że nie wiem, jak wymyśliłem odpowiedź, a raczej nie wiem, jak to działa. Specjalnie na arr> 0 jak filtr wiedział, że arr jest na bieżąco w arr [1], arr [2], itd .. bez użycia pętli do iteracji we wszystkich tablicach.

lub po prostu wyjaśnić, jak działa kod. [Próbowałem wyjaśnić to wyraźnie ---]

+1

Twój kod jest nieprawidłowy. Nie działa dla wartości takich jak "-1" ... Wypróbuj 'arr.filter (function (item) {return !! item;})' –

+3

@NiettheDarkAbsol why not '[0, 1, 2, 3, 'ate', '', false] .filter (Boolean) '? –

+0

yeah Filtr Boolean jest najlepszy, chyba że chcesz zachować undefined – juvian

Odpowiedz

4

Spójrz na docs dla Array.filter. Zwróć szczególnie uwagę na argumenty wywołania zwrotnego:

Funkcja do testowania każdego elementu tablicy. Wywoływany z argumentami (element, indeks, tablica). Zwróć true, aby zachować element, w przeciwnym razie false.

Tak więc w twoim przypadku arr jest elementem (i słabo nazwanym, stąd twoje pomyłki). Przefiltruj pętle przez twoją tablicę i dla każdej pozycji, którą wywołasz, oddzwonisz w elemencie w bieżącej pozycji jako arr.

Jak zauważyli inni w komentarzach, logika wywołania zwrotnego filtra jest w rzeczywistości błędna dla wartości ujemnych, ale może to nie być problemem, jeśli wiesz, że twoja tablica nigdy nie będzie zawierać wartości ujemnych (ale może to być niebezpieczna rzecz do przyjęcia).

I, oczywiście, wewnętrznie, to zapętla się przez twoją tablicę. Nie możesz filtrować swojej (nieposortowanej) tablicy bez dotykania każdego elementu w tablicy. Spójrz na polyfil w linku, aby dowiedzieć się, jak to działa (może dlatego, że jest to szczegół implementacji, który może różnić się w różnych silnikach javascript, ale bez wątpienia będzie zawierał gdzieś pętlę), pętle przechodzą przez twoją tablicę, wywołuje callback (zwróć uwagę na argumenty) i jeśli callback zwróci wartość true, zostanie ona przekazana do tablicy wyników.

+0

Dzięki! to właśnie chciałem wiedzieć. ** wewnętrznie przeplata Twoją tablicę ** Dziękuję bardzo! i spróbuję poprawić nazewnictwo zmiennych! :) – Fhrey

0

Funkcja do testowania każdego elementu tablicy. Wywoływany z argumentami (element, indeks, tablica). Zwróć true, aby zachować element, false inaczej

Jeśli chcesz tylko wyjaśnienie. Array filter() jak sugeruje nazwa. Usuń niechciany element, jeśli warunek nie spełnia wymagań (false).

(arr > 0|| isNaN(arr) === true)

0, false || false //removed 
1, true || false 
2, true || false 
3, true || false 
'ate', false || true 
'', false|| false // removed 
false false || false //removed 

wyjściowa:

[1, 2, 3, "ate"] 
+0

Dzięki! po zrozumieniu, że metoda filter() przechodzi przez wszystkie elementy tablicy, ten przykład stanowi doskonały sposób na pokazanie, jak działa moja funkcja filtlor! wspaniała pomoc! – Fhrey

56

Jeśli zadano odfiltrować NaN, null, 0, false w tablicy, oznacza to rozwiązania nie naprawdę działa.

Twój wkład:

bouncer([0, 1, 2, 3, 'ate', '', false, NaN]); 

dostanie wyjście:

[1, 2, 3, 'ate', NaN] 

odfiltrować wszystkie 'falsy' wartości można po prostu użyć Boolean:

function bouncer(arr) { 
    return arr.filter(Boolean); 
} 

bouncer([0, 1, 2, 3, 'ate', '', false, NaN]); 

Output :

[1, 2, 3, 'ate'] 

Ponieważ konstruktor Boolean jest również funkcja, zwraca albo true dla 'truthy argument lub false dla' falsy argument. Jeśli wartość zostanie pominięta lub jest 0, -0, null, lub pusty ciąg znaków (""), obiekt ma wartość false. Wszystkie inne wartości, w tym dowolny obiekt lub ciąg znaków "false", tworzą obiekt o wartości początkowej true.

+1

Uwielbiam zwięzłość tego podejścia. – Gaege

+0

Łatwo zrozumiałe i szybkie rozwiązanie. – ethane

+0

To jest fajne. Szybki i niesamowity! – XxXk5XxX

1

nie byłoby bardziej elegancki do bazy na założeniu, że wszystkie niechciane elementy odlewane false gdy logiczna z oczekiwaniami, więc:

function clear (arr){ 
    var stripped = []; 
    for (i = 0, len = arr.length; i < len; i++){ 
     if (arr[i]) 
     stripped.push(arr[i]); 
    } 
    return stripped; 
} 
2

Pracuję też na kodzie bezpłatny Obóz Falsy Bouncer algorytmu. Znalazłem najprostszy sposób to zrobić jest:

function bouncer(arr) { 
    return arr.filter(Boolean); 
} 
4

Można również użyć funkcję tożsamości zamiast Boolean.

function bouncer(arr) { 
    return arr.filter(x => x); 
} 
+0

Jak? Czy możesz wyjaśnić? – rish

+0

Ta odpowiedź jest lepsza niż akceptowana i obecnie najbardziej uprzywilejowana. – micapam

2

Sposób filter() tworzy się nową tablicę ze wszystkimi elementami, które przechodzą test realizowane przez funkcję usług.

Od false, null, 0, "", undefined i NaNFalsy wartości w JavaScript zatem wrócą fałszywy podczas badania.

function bouncer(arr) { 
    var array = arr.filter(function(val){ 
    return val; 
    }); 
    return array; 
} 

tylko wartości, które nie return false zostanie dodany do tablicy.

0

Ponieważ jestem początkujący o, kodowanie, moja logika poszła w użyciu prymitywnych Boolean's porównać item's filtrowane, ale to było przed Czytałem Boolean odwołanie do obiektu, można zobaczyć, że jak jego pisemne tam, "Wartość przekazana jako pierwszy parametr jest konwertowana na wartość logiczną, jeśli to konieczne.Jeśli wartość jest pominięta lub wynosi 0, -0, zero, fałsz, NaN, niezdefiniowana lub pusty ciąg (" "), obiekt ma wartość początkową false Wszystkie inne wartości, w tym dowolny obiekt lub ciąg "false", tworzą obiekt o wartości początkowej true." Więc logika, ponieważ filtr zwraca wartość, jeśli jest prawdą lub fałszem, powinieneś zwrócić wartości, jeśli są one prawdziwe . Również, nie dowiedziałem się wszystkiego o metodzie filtrowania, do tego, co zbadałem, mam dostał nieco więcej informacji, które postaram się wyjaśnić here.'

przedefiniowanie metody (to już istnieje, jest tylko dla zrozumienia) metoda filtr przyjmuje funkcję o nazwie predykatem, że jest funkcją który otrzymuje wartość i zwraca wartość true lub false.

Wyniki var to pusta tablica, w której wyniki zostaną pchnięte za pomocą metody push. Używamy w tym celu metody forEach (to, w tym kontekście jest stosowane do prototypu macierzy, oznacza to, że będzie dostępna metoda filtrowania dla każdej zdefiniowanej macierzy, z sintax dla array.method (args) ins tym przypadku array.filter (args)) niektóre zasoby https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype

teraz będziemy prowadzić operację w każdym punkcie na tablicy za pomocą metody foreach, teraz będziemy stosować funkcję predykatu swędzieć pozycję tablica i jeśli zwróci true, doda ją do wyników.

Array.prototype.filter = function(predicate){ 
    var results = []; 

    this.forEach(function(item) { 
     if (predicate(item)) { 
      results.push(item); 
     } 

    }); 
}; 

// ------------------------------- Prawidłowe rozwiązanie -------- -------------------

function bouncer (arrToFilter){ 

    return arrToFilter.filter(Boolean); 
} 

// ---------- Kod bez metody filtrowania ------- -

function bouncerNoFilterMethod(arrToFilter){ 
    var results = []; 

    arrToFilter.forEach(function(arrToFilter){ 
     if(arrToFilter){ 
      results.push(arrToFilter); 
     } 
    }); 

    return results;  
} 

console.log(bouncerNoFilterMethod([7, "ate", "", false, 9])); 
console.log(bouncerNoFilterMethod(["a", "b", "c"])); 
console.log(bouncerNoFilterMethod([false, null, 0, NaN, undefined, ""])); 
console.log(bouncerNoFilterMethod([1, null, NaN, 2, undefined])); 
console.log(bouncer([7, "ate", "", false, 9])); 
console.log(bouncer(["a", "b", "c"])); 
console.log(bouncer([false, null, 0, NaN, undefined, ""])); 
console.log(bouncer([1, null, NaN, 2, undefined])); 

Nadzieja to pomaga zrozumieć, metoda, a pierwszą rzeczą, która nie rozumiejąc był częścią przekazując funkcję predykatu do metody, jeśli mam błędy tu proszę sugerować poprawek.

0

Wygląda na to, że Boolean jest najprostszą poprawką/odpowiedzią na wyzwanie "FreeCodeCamp", jednak może być użyteczne wypróbowanie kilku rzeczy tylko po to, aby zrozumieć "dlaczego" i "jak".

function bouncer(arr) { 
     return arr.filter(function(val){ 
     return val; 
    }); 
    } 

Umożliwia ocenę wszystkiego, co przechodzi przez filtr, za pomocą przekazanej funkcji (wywołania zwrotnego), która zwraca wartości. Jeśli nie zwróci wartości, której wartość null itp nie będzie, nie zostanie uwzględniona w zwrocie. Przynajmniej ta metoda pomogła mi zrozumieć, dlaczego zamiast po prostu zdać test.

-2
function bouncer(arr) { 
    // Don't show a false ID to this bouncer. 

    function isFalsyBouncer(value){ 
    if(Boolean(false)||Boolean(null)||Boolean(0)||Boolean("")||Boolean(undefined)||Boolean(NaN)){ 

    }else{ 
     return value; 
    } 
    } 
    var filtered=arr.filter(isFalsyBouncer); 
    return filtered; 
} 
+0

Proszę nie zostawiać odpowiedzi "tylko kod" – Alex

+0

To robi ** nie ** odpowiedź na pytanie w sposób użyteczny. ** dlaczego ** uważasz, że to jest odpowiedź? **jak to działa? Po prostu mówienie komuś, żeby wymienił ich kod lub po prostu oznaczył kogoś działającego bez kontekstu lub znaczenia, nie pomoże im dowiedzieć się, co zrobili źle, a także nie jest tak przydatny dla przyszłych czytelników. – GrumpyCrouton