2017-10-02 25 views
5

dizgesine dahil edilip edilmediğini kontrol edin Bazı iletişim türleri için bazı istemci tarafında doğrulama üzerinde çalışıyorum, web sitesi şu anda çevrimiçi değil, sunucu tarafı uygun değil.Dizi değeri

Form gönderilmeden önce müstehcen herhangi bir küfürden haberdar olmak için bir 'sözcük filtresi' oluşturmaya çalışıyorum. kullanıcının kelime1 'girmek için olsaydı ayıp olmadan İşte kod

...

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

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

, bu kelimeyi yakalayacak. Kullanıcı 'word1word2' veya 'John bir word3' girerse, onu yakalamaz.

Aslında daha iyi çalıştıran bir for döngüsü vardı, ancak yine de kelimeler ('word1word2') arasındaki boşluk olmadan çalışmayacaktım.

Herhangi bir girdi büyük bir memnuniyetle karşılanacaktır, arama yapıyorum ama hiçbir şey ihtiyaçlarımla eşleşmiyor.

EDIT: Öyleyse ben de bir çözüm buldum, ancak bunun başarılabileceğinin farklı yollarını görmek, nasıl çalıştığına ve belirli bir yolun neden daha iyi olduğuna merak ediyorum. Ben ile geldi İşte neyi

...

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; 
     } 
    } 
} 

cevap

5

özel eşleştirme yapmak zorunda beri, some yerine indexOf aradığınız:

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

Veya bir ES2015 + ok

işlev ve String.prototype.includes:

some, gerçeği doğru bir değer döndürdüğünde tekrar tekrar çağırır. Geri dönüş bir gerçek değere dönerse, some, true; aksi halde some, false değerini döndürür. Örneğin, girişlerin "bazılarının" yüklem işleviyle eşleşip eşleşmediğini soruyor. (any daha iyi bir terim olabilir, ancak yerleşiklere eklerken, TC39 komitesinin kütüphaneler ve benzeri çakışmalardan kaçınmak için çok fazla iş yapması gerekir.)

Asla gerçek geri dönmeniz gerekiyorsa girdisi, girdiyi döndüren find kullanın veya bulunamadıysa undefined kullanın. Dizine ihtiyacınız varsa, findIndex kullanın.


Yan not: Bunu iyi yapmak için çok zor olduğundan emin olun.

+0

Ben Sadece başlıyor, bu yüzden şimdilik ES2015 + 'dan kaçınacağımı düşünüyorum. Bazılarına gelince, neyle karşılaştığımla karşılaştırıldığında nasıl çalışır? – mrkd1991

+0

@ mrkd1991: Orada "nasıl çalışıyor" ile kastettiğinizden emin değilsiniz. Performansı kastediyorsanız, JavaScript motorları ** çok ** işlev çağrılarında hızlıdır. İşte bu yazımda 2012'de yaptığım bir yazı; Hatta IE6, isteyebileceğiniz en yavaş JavaScript motoru, bu kadar hızlı yaptılar bir faktör değildi: http://blog.niftysnippets.org/2012/02/foreach-and-runtime-cost.html –

+0

Olduğu gibi, bu işlev istenen sonucu elde etmek için ne yapar ve bu ve yeni denemem arasındaki fark nedir? – mrkd1991

0

böyle bir şey deneyebilirsiniz ... the Scunthorpe problem dikkat ve tabii ki insanlar rutin sadece harf veya yedek yıldız işareti ya da bu tür yenmek için benzer filtrelerin sırasını karıştıracaktır: -

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

Kullandığım yöntemin tersine bir boolean kullanarak nasıl karşılaştırırsınız? Ayrıca, str, aktarılmadan önce biçimlendirilir, dolayısıyla bu işlevde buna gerek yoktur. – mrkd1991