2017-10-02 18 views
5

Tôi đang làm việc trên một số xác thực phía ứng dụng cho một loại liên hệ, trang web hiện không trực tuyến để phía máy chủ không có liên quan.Kiểm tra xem giá trị mảng có được bao gồm trong chuỗi

Tôi đang cố gắng tạo 'bộ lọc từ' để nắm bắt bất kỳ hành vi lạm dụng ngôn ngữ tục tĩu nào trước khi biểu mẫu được 'gửi'.

Heres mã, mà không có những lời tục tĩu ...

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

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

Nếu người dùng đã nhập 'word1', nó sẽ bắt chữ. Nếu người dùng nhập 'word1word2' hoặc 'John là một từ3', nó không bắt được nó.

Ban đầu tôi có vòng lặp for hoạt động tốt hơn, nhưng vẫn không hoạt động nếu không có khoảng trống giữa các từ ('word1word2').

Bất kỳ đầu vào nào sẽ được đánh giá rất nhiều, tôi đã tìm kiếm nhưng không có gì phù hợp với nhu cầu của tôi.

EDIT: Vì vậy, tôi cũng đã đưa ra một giải pháp, nhưng nhìn thấy những cách khác nhau này có thể đạt được Tôi tò mò như thế nào nó hoạt động và cũng tại sao một cách cụ thể là tốt hơn?

Heres những gì tôi đã đưa ra ...

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

Trả lời

5

Bạn đang tìm kiếm some hơn indexOf, vì bạn phải làm phù hợp tùy chỉnh:

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

Hoặc với một ES2015 + mũi tên chức năng và String.prototype.includes:

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

some gọi lại cuộc gọi lại cho đến lần đầu tiên nó trả về giá trị trung thực. Nếu cuộc gọi lại bao giờ trả về giá trị trung thực, thì some sẽ trả về true; nếu không, some sẽ trả về false. Ví dụ: nó hỏi xem "một số" mục có khớp với hàm vị ngữ hay không. (any có thể đã là một thuật ngữ tốt hơn, nhưng khi thêm vào các built-in, ủy ban TC39 phải làm rất nhiều công việc để tránh xung đột với các thư viện và như vậy.)

Nếu bạn cần lấy lại thực tế mục nhập, sử dụng find trả về mục nhập hoặc undefined nếu không tìm thấy. Nếu bạn cần chỉ mục của nó, hãy sử dụng findIndex.


Lưu ý bên cạnh: Chỉ cần cẩn thận rằng nó nổi tiếng là phức tạp để làm điều này tốt. Cẩn thận với the Scunthorpe problem, và tất nhiên mọi người sẽ thường xuyên chỉ gây nhầm lẫn cho chuỗi các ký tự hoặc dấu hoa thị thay thế hoặc tương tự để đánh bại các bộ lọc của loại này ...

+0

tôi m chỉ bắt đầu, vì vậy tôi nghĩ rằng tôi sẽ tránh ES2015 + bây giờ. Đối với một số, làm thế nào nó hoạt động so với những gì tôi đã đưa ra? – mrkd1991

+0

@ mrkd1991: Không chắc chắn ý của bạn là "nó hoạt động như thế nào" ở đó. Nếu bạn có nghĩa là hiệu suất, các công cụ JavaScript ** rất nhanh ở các cuộc gọi hàm. Đây là một bài viết tôi đã làm trên đó trở lại vào năm 2012; thậm chí IE6, công cụ JavaScript chậm nhất mà bạn có thể yêu cầu, đã làm chúng nhanh đến nỗi nó không phải là một yếu tố: http://blog.niftysnippets.org/2012/02/foreach-and-runtime-cost.html –

+0

Như trong, chức năng này làm gì để đạt được kết quả mong muốn, và điều gì khác biệt giữa điều đó và nỗ lực mới của tôi? – mrkd1991

0

bạn có thể thử một cái gì đó như thế này: -

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

Bạn sẽ so sánh bằng cách sử dụng boolean như trái ngược với phương pháp tôi đã sử dụng? Ngoài ra, str được định dạng trước khi được truyền nên không cần phải làm như vậy trong hàm này. – mrkd1991

Các vấn đề liên quan