2017-10-02 17 views
5

pracuję nad pewnym walidacji po stronie klienta za pomocą formularza kontaktowego rodzaju, na stronie internetowej nie jest obecnie online, aby po stronie serwera nie jest istotne.Sprawdź, czy wartość tablica znajduje się w ciąg

Próbuję stworzyć „filtr słowo” złapać na żadnym nadużyciem języka obscenicznego zanim forma jest „złożony”.

Herezje kod, bez przekleństw ...

function filterInput(str) { 
    var inputFilter = ['word1', 'word2', 'word3']; 
    var arrayLength = inputFilter.length; 

if (inputFilter.indexOf(str) > - 1) { 
    // Word caught... 
} else { 
    // Clear... 
} 

Jeśli użytkownik miały wejść 'word1', będzie to złapać słowo. Jeśli użytkownik wprowadzi słowo "word1word2" lub "John is word3", to go nie przechwyci.

pierwotnie miał dla pętli, który pracował lepiej, ale nadal nie będzie działać bez spacji między słowami („word1word2”).

Każde wejście byłoby bardzo mile widziane, Szukałam, ale nic zupełnie nie pasuje do moich potrzeb.

EDYCJA: Więc też wymyślam rozwiązanie, ale widzę różne sposoby, w jakie można to osiągnąć Ciekawi mnie, jak to działa i dlaczego konkretny sposób jest lepszy?

Herezje co wymyśliłem ...

function filterInput(str) { 
    var inputFilter = ['word1', 'word2', 'word3']; 
    var arrayLength = inputFilter.length; 

    for (var i = 0; i < arrayLength; i++) { 
     if (str.includes(inputFilter[i])) { 
      window.alert('Message...'); 
      return; 
     } 
    } 
} 

Odpowiedz

5

Szukacie some zamiast indexOf, ponieważ trzeba zrobić niestandardowe dopasowanie:

if (inputFilter.some(function(word) { return str.indexOf(word) != -1; })) { 
    // Word caught... 
} else { 
    // Clear... 
} 

lub z ES2015 + strzałka funkcja i String.prototype.includes:

if (inputFilter.some(word => str.includes(word))) { 
    // Word caught... 
} else { 
    // Clear... 
} 

some wywołuje wywołanie zwrotne wielokrotnie, dopóki nie po raz pierwszy zwróci wartość truey. Jeśli wywołanie zwrotne kiedykolwiek zwróci wartość truey, some zwraca true; w przeciwnym razie some zwraca false. Np. Pytanie, czy "niektóre" wpisy pasują do funkcji predykatu. (any może być lepszym terminem, ale dodając do wbudowanych, komitet TC39 musi dużo pracować, aby uniknąć konfliktów z bibliotekami i innymi).

Jeśli kiedykolwiek będziesz musiał wrócić wpis, użyj find, który zwraca wpis lub undefined, jeśli nie zostanie znaleziony. Jeśli potrzebujesz jego indeksu, użyj findIndex.


Nota boczna: Należy jednak pamiętać, że wykonywanie tej czynności jest bardzo skomplikowane. Strzeż the Scunthorpe problem i oczywiście ludzie będą rutynowo po prostu pomylić kolejność liter lub gwiazdkami zastępczych lub podobnych do pokonania filtrów tego rodzaju ...

+0

I m dopiero zaczyna, więc myślę, że na razie uniknę ES2015 +. Jeśli chodzi o niektórych, jak to działa w porównaniu do tego, co wymyśliłem? – mrkd1991

+0

@ mrkd1991: Nie wiesz, co masz na myśli przez "jak to działa". Jeśli masz na myśli wydajność, silniki JavaScript są ** bardzo ** szybkie przy wywołaniach funkcji. Oto artykuł, który zrobiłam na ten temat w 2012 roku; nawet IE6, najwolniejsza silnik JavaScript o co można zapytać, czy je tak szybko, że nie był to czynnik: http://blog.niftysnippets.org/2012/02/foreach-and-runtime-cost.html –

+0

W jaki sposób ta funkcja służy uzyskaniu pożądanego rezultatu i jaka jest różnica między tą i nową próbą? – mrkd1991

0

można spróbować coś takiego: -

function filterInput(str) { 
    var badWords = ['bad', 'worst']; 
    var isTrue = false; 
    if(str) { 
    for (var i = 0; i < badWords.length; i++) { 
     isTrue = !!(str.replace(/\W|\s/g, '').toLowerCase().indexOf(badWords[i]) + 1); 
     if(isTrue) break; 
    } 
    } 
    return isTrue; 
} 
+0

Jak porównałbyś użycie metody boolowskiej w przeciwieństwie do metody, której użyłem? Ponadto str jest formatowany przed przekazaniem, więc nie trzeba tego robić w ramach tej funkcji. – mrkd1991

Powiązane problemy