Kiedy kodujemy puste w istocie, może to oznaczać jedno z poniższych, biorąc pod uwagę okoliczności;
- 0 jak w wartości liczbowej
- 0.0 jak w wartości zmiennoprzecinkowej
- „0” jak w wartości ciągu
- „0.0” jak w wartości ciągu
- null jak w wartości Null, ponieważ przypadkowo może również przechwycić undefined lub nie
- undefined jako wartość undefined
- fałszywe jako fałszywe prawdziwe wartości, na przypadek 0 również jako prawdziwe, ale co, jeśli chcemy uchwycić fałszywe takie, jakie są
- „” pusta wartość żądań bez spacji i tabulacji
- „” tylko ze spacją lub tabulatorem
W rzeczywistej sytuacji, jak stwierdził OP, możemy chcieć przetestować je wszystkie lub czasami możemy chcieć przetestować tylko dla ograniczonego zestawu warunków.
Generalnie if(!a){return true;}spełnia swoje zadanie przez większość czasu, jednak nie obejmuje szerszego zestawu warunków.
Kolejny hack, który się pojawił, to return (!value || value == undefined || value == "" || value.length == 0);
Ale co, jeśli potrzebujemy kontroli nad całym procesem?
Nie ma prostego rozwiązania whiplash w natywnym rdzeniu JavaScript, które musi zostać przyjęte. Biorąc pod uwagę, że porzucamy wsparcie dla starszej wersji IE11 (szczerze mówiąc, nawet Windows tak powinno być), poniżej rozwiązanie zrodzone z frustracji działa we wszystkich nowoczesnych przeglądarkach;
function empty (a,b=[])
{if(!Array.isArray(b)) return;
var conditions=[null,'0','0.0',false,undefined,''].filter(x => !b.includes(x));
if(conditions.includes(a)|| (typeof a === 'string' && conditions.includes(a.toString().trim())))
{return true;};
return false;};`
Logika rozwiązania polega na tym, że funkcja ma dwa parametry a i b , a to wartość, którą musimy sprawdzić, b to tablica z ustawionymi warunkami, które musimy wykluczyć ze wstępnie zdefiniowanych warunków, jak podano powyżej. Domyślna wartość b jest ustawiona na pustą tablicę [].
Pierwszym uruchomieniem funkcji jest sprawdzenie, czy b jest tablicą, czy nie, a jeśli nie, to wcześniejsze wyjście z funkcji.
następnym krokiem jest obliczenie różnicy w tablicy z [null,'0','0.0',false,undefined,'']i z tablicy b. jeśli b jest pustą tablicą, predefiniowane warunki będą obowiązywać, w przeciwnym razie usunie pasujące wartości.
warunki = [zestaw predefiniowany] - [zestaw wykluczony]
funkcja filtru robi dokładnie to, co z niej korzysta. Teraz, gdy mamy warunki w tablicy, wszystko, co musimy zrobić, to sprawdzić, czy wartość jest w tablicy warunków.
include function robi dokładnie to, czego nie trzeba pisać własnych paskudnych pętli, niech silnik JS wykona ciężkie prace.
Rozumiem,
jeśli mamy przekonwertować ciąg znaków w celu porównania, 0 i 0,0 działałyby dobrze, jednak Null i Undefined mogłyby spowodować błąd blokujący cały skrypt. Potrzebujemy rozwiązania na skrajne przypadki. Poniżej proste || obejmuje skrajny przypadek, jeśli pierwszy warunek nie jest spełniony. Uruchomienie kolejnego wczesnego sprawdzania obejmuje wcześniejsze wyjście, jeśli nie zostanie spełnione.
if(conditions.includes(a)|| (['string', 'number'].includes(typeof a) && conditions.includes(a.toString().trim())))
Funkcja trim () obejmie tylko wartość szerszych odstępów i tabulatorów i będzie działać tylko w scenariuszu skrajnym.
Plac zabaw
function empty (a,b=[]){
if(!Array.isArray(b)) return;
conditions=[null,'0','0.0',false,undefined,''].filter(x => !b.includes(x));
if(conditions.includes(a)||
(['string', 'number'].includes(typeof a) && conditions.includes(a.toString().trim()))){
return true;
}
return false;
}
console.log('1 '+empty());
console.log('2 '+empty(''));
console.log('3 '+empty(' '));
console.log('4 '+empty(0));
console.log('5 '+empty('0'));
console.log('6 '+empty(0.0));
console.log('7 '+empty('0.0'));
console.log('8 '+empty(false));
console.log('9 '+empty(null));
console.log('10 '+empty(null,[null]));
console.log('11 dont check 0 as number '+empty(0,['0']));
console.log('12 dont check 0 as string '+empty('0',['0']));
console.log('13 as number for false as value'+empty(false,[false]));
Zróbmy to bardziej złożonym - co, jeśli nasza wartość do porównania jest tablicą i może być tak głęboko zagnieżdżona, jak to tylko możliwe. co, jeśli mamy sprawdzić, czy jakakolwiek wartość w tablicy jest pusta, może to być skrajny przypadek biznesowy.
function empty (a,b=[]){
if(!Array.isArray(b)) return;
conditions=[null,'0','0.0',false,undefined,''].filter(x => !b.includes(x));
if(Array.isArray(a) && a.length > 0){
for (i = 0; i < a.length; i++) { if (empty(a[i],b))return true;}
}
if(conditions.includes(a)||
(['string', 'number'].includes(typeof a) && conditions.includes(a.toString().trim()))){
return true;
}
return false;
}
console.log('checking for all values '+empty([1,[0]]));
console.log('excluding for 0 from condition '+empty([1,[0]], ['0']));
jest to prosta i szersza funkcja przypadku użycia, którą przyjęłam w swoim programie;
- Daje kontrolę nad tym, czym dokładnie jest definicja pustego w danej sytuacji
- Daje kontrolę nad przedefiniowaniem warunków pustego
- Może porównywać prawie każdą rzecz, od ciągów, liczb, zmiennoprzecinkowych, prawdziwych, zerowych, nieokreślonych i głębokich tablic
- Rozwiązanie zostało opracowane z uwzględnieniem odnawialności i elastyczności. Wszystkie inne odpowiedzi są odpowiednie na wypadek, gdyby trzeba było zająć się jednym lub dwoma prostymi przypadkami. Jednak zawsze zdarza się, że definicja pustych zmian podczas kodowania powyżej fragmentów kodu działa w tym przypadku bezbłędnie.
if(data)wystarczyłoby, jak napisano tutaj