2017-10-02 15 views
5

मैं एक तरह के संपर्क फार्म के लिए कुछ क्लाइंट साइड सत्यापन पर काम कर रहा हूँ में शामिल है, वेबसाइट वर्तमान में नहीं ऑनलाइन तो सर्वर साइड प्रासंगिक नहीं है।चेक यदि सरणी मान स्ट्रिंग

मैंने पहले प्रपत्र 'प्रस्तुत' है अश्लील भाषा के किसी भी अपमानजनक पर पकड़ने के लिए एक 'शब्द फिल्टर' बनाने के लिए कोशिश कर रहा हूँ।

यहाँ कोड, अश्लीलता परोसने के बिना ...

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

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

उपयोगकर्ता word1 'दर्ज करना हो तो यह शब्द पकड़ लेंगे। यदि उपयोगकर्ता 'word1word2' या 'जॉन एक शब्द 3' में प्रवेश करता है, तो उसे पकड़ नहीं आता है।

मैं मूल रूप से जो बेहतर काम किया पाश के लिए एक था, लेकिन अभी भी ('word1word2') शब्दों के बीच खाली स्थान के बिना काम नहीं होता।

किसी भी इनपुट बहुत सराहना की जाएगी, मैं खोज रहा है, लेकिन कुछ भी नहीं काफी मेरी जरूरतों से मेल खाता है।

संपादित करें: तो मैं भी एक समाधान के साथ आ गए हैं, लेकिन अलग-अलग तरीकों से इस प्राप्त किया जा सकता मैं यह कैसे काम करता है के रूप में उत्सुक हूँ और यह भी कारण है कि एक खास तरह से बेहतर है देख रहे हैं?

Heres क्या मैं के साथ आया था ...

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

उत्तर

5

आप some बजाय indexOf लिए देख रहे हैं, जब से तुम कस्टम मिलान करना है:

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

या एक ES2015 + तीर के साथ फ़ंक्शन और String.prototype.includes:

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

कॉलबैक बार-बार कॉल करता है जब तक कि पहली बार यह एक सच्चाई मूल्य नहीं देता है। यदि कॉलबैक कभी भी एक सच्चा मूल्य देता है, sometrue देता है; अन्यथा, somefalse देता है। उदाहरण के लिए, यह पूछ रहा है कि प्रविष्टियों के "कुछ" अनुमानित फ़ंक्शन से मेल खाते हैं या नहीं। (any एक बेहतर शब्द हो सकता है, लेकिन बिल्ट-इन्स में जोड़ने पर, टीसी 3 9 समिति को पुस्तकालयों और इस तरह के संघर्षों से बचने के लिए बहुत सारे काम करना पड़ता है।)

यदि आपको कभी भी वास्तविक वापस पाने की आवश्यकता है प्रविष्टि, find का उपयोग करें जो प्रविष्टि या undefined लौटाता है यदि नहीं मिला। यदि आपको इसकी अनुक्रमणिका की आवश्यकता है, तो findIndex का उपयोग करें।


साइड नोट: बस सावधान रहना है कि यह इस अच्छी तरह से करना बेहद जटिल है। the Scunthorpe problem से सावधान रहें, और निश्चित रूप से लोगों को नियमित रूप से बस पत्र या स्थानापन्न तारक या इस तरह की हराने के लिए इसी तरह के फिल्टर के अनुक्रम को भ्रमित करेंगे ...

+0

मैं मैं केवल शुरुआत कर रहा हूं, इसलिए मुझे लगता है कि मैं अब ES2015 + से बचूंगा। कुछ के लिए, यह मेरे साथ आने के मुकाबले कैसे काम करता है? – mrkd1991

+0

@ mrkd1991: सुनिश्चित नहीं है कि "यह कैसे काम करता है" से आपका क्या मतलब है। यदि आपका प्रदर्शन प्रदर्शन है, तो जावास्क्रिप्ट इंजन फ़ंक्शन कॉल पर ** बहुत ** तेज़ हैं। यहां एक लेख है जो मैंने 2012 में उस पर किया था; http://blog.niftysnippets.org/2012/02/foreach-and-runtime-cost: भी IE6, धीमी JavaScript इंजन आप के लिए पूछ सकते हैं, उन्हें इतनी तेजी से यह एक कारक नहीं था।एचटीएमएल –

+0

जैसा कि, वांछित परिणाम प्राप्त करने के लिए यह कार्य क्या करता है, और उस और मेरे नए प्रयास के बीच क्या अंतर है? – mrkd1991

0

आप कुछ इस तरह की कोशिश कर सकते हैं: -

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

मैंने जिस विधि का उपयोग किया है उसके विपरीत एक बूलियन का उपयोग करके आप कैसे तुलना करेंगे? इसके अलावा, पारित होने से पहले स्ट्रेट स्वरूपित किया गया है इसलिए इस फ़ंक्शन के भीतर ऐसा करने की आवश्यकता नहीं है। – mrkd1991

संबंधित मुद्दे