2016-05-25 42 views
15

Làm cách nào để kiểm tra xem chuỗi có chứa bất kỳ phần tử nào của mảng không? Tôi muốn lọc một số mảng nếu phần tử có một số chuỗi. Vui lòng xem mã dưới đây.Kiểm tra xem chuỗi có chứa bất kỳ phần tử nào của một mảng trong JavaScript

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 
 

 
function checker(value) { 
 
    var prohibited = ['banana', 'apple']; 
 

 
    for (var i = 0; i < prohibited.length; i++) { 
 
    if (value.indexOf(prohibited[i]) == -1) { 
 
     return true; 
 
    } else { 
 
     return false; 
 
    } 
 
    } 
 
} 
 

 
arr = arr.filter(checker); 
 
console.log(arr);

Kết quả là [ 'apple', 'kiwi', 'orange' ]. Các 'apple' nên được loại bỏ, nhưng nó không phải là.

Mã trên chỉ lọc 'chuối', không phải 'táo'. Tôi có nhiều từ khóa để lọc. Có cách nào dễ hơn không?

Trả lời

15

Sự cố nằm trong vòng lặp for, chỉ lặp lại một lần kể từ khi trả về kết thúc hàm, cắt vòng lặp for trong tiến trình. Vì vậy, bạn có thể cập nhật mã như vậy để làm cho hàm chỉ trả về khi vòng lặp for đã được hoàn thành.

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 
 

 
function checker(value) { 
 
    var prohibited = ['banana', 'apple']; 
 

 
    for (var i = 0; i < prohibited.length; i++) { 
 
    if (value.indexOf(prohibited[i]) > -1) { 
 
     return false; 
 
    } 
 
    } 
 
    return true; 
 
} 
 

 
arr = arr.filter(checker); 
 
console.log(arr);


Đối với việc giảm chức năng bạn có thể sử dụng every()indexOf() phương pháp

Các 'mọi' phương pháp thực hiện chức năng gọi lại cung cấp một lần cho mỗi phần tử có trong mảng cho đến khi nó tìm thấy một nơi mà gọi lại trả về một giá trị giả (một giá trị trở thành false khi chuyển đổi sang một Boolean). Nếu tìm thấy một phần tử như vậy, thì mọi phương thức đều trả về false. Nếu không, nếu gọi lại trả về giá trị thực cho tất cả các phần tử, mọi giá trị sẽ trả về true. callback được gọi chỉ cho các chỉ mục của mảng đã gán các giá trị; nó không được gọi cho chỉ số đó đã bị xóa hoặc chưa từng được gán giá trị. (Taken from here)

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 
 

 
function checker(value) { 
 
    var prohibited = ['banana', 'apple']; 
 
    return prohibited.every(function(v) { 
 
    return value.indexOf(v) == -1; 
 
    }); 
 
} 
 

 
arr = arr.filter(checker); 
 
console.log(arr);


Đối với trình duyệt cũ check polyfill option of every method.


Bạn thậm chí có thể sử dụng regex tại đây.Tạo regex sử dụng mảng và sử dụng test() để kiểm tra trận đấu

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 
 

 
function checker(value) { 
 
    var prohibited = ['banana', 'apple']; 
 
    var regex = new RegExp(prohibited.map(function(s) { 
 
    return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&') 
 
    }).join('|')); 
 
    return !regex.test(value); 
 
} 
 

 
arr = arr.filter(checker); 
 
console.log(arr);

Tham khảo câu trả lời này cho chuỗi regex chuyển đổi: Can you create JavaScript regexes on the fly using string variables?

0
<script> 
$(document).ready(function(){ 
    var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 

    var prohibited = ['banana', 'apple']; 

$.each(arr,function(arr_index,arr_value) 
{ 
    $.each(prohibited,function(p_index,p_value) 
    { 
     if(arr_value == p_value) 
     { 
      alert(arr_value+" = "+p_value); 
     } 
     else 
     { 
      alert(arr_value+" != "+p_value); 
     } 
    }); 
}); 

}); 
</script> 
+1

Tôi không thấy jQuery ở bất kỳ nơi nào được đề cập trong câu hỏi bởi OP, ngoài ra, một số giải thích về "cách mã của bạn hoạt động" sẽ hữu ích. –

+1

JQuery không được đề cập nhưng người hỏi yêu cầu xác định một số cách dễ dàng hơn để anh ta có thể hiểu dễ dàng. Mã hoạt động tốt, bởi vì tôi đã thử nghiệm nó. ** mỗi ** chức năng tương tự như ** foreach **, do đó lồng nhau sẽ giải quyết vấn đề –

+0

Chắc chắn điều này sẽ làm việc, không có nghi ngờ, nhưng chúng ta không nên cung cấp câu trả lời jQuery cho các câu hỏi JavaScript. –

0

Ví dụ bằng cách xây dựng một RegExp và thử nghiệm với điều đó:

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 
var prohibited = ['banana', 'apple']; 

var escapeForRegex = function(str) { 
    return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); 
}; 

var r = new RegExp(prohibited.map(escapeForRegex).join("|")); 
arr.filter(function(v){ return !r.test(v) }); 
11

Nó có thể đơn giản như vậy:

const arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 
 

 
const checker = value => 
 
    !['banana', 'apple'].some(element => value.includes(element)); 
 

 
console.log(arr.filter(checker));

ECMAScript 6 FTW!

checker sử dụng an arrow function.

! có nghĩa là nó sẽ loại trừ tất cả các yếu tố không đáp ứng các điều kiện.

Các some() thử nghiệm phương pháp dù một số phần tử trong mảng vượt qua bài kiểm tra được thực hiện bởi các chức năng được cung cấp.

từ Array.prototype.some() docs on MDM

Phương pháp includes() sẽ xác định xem một chuỗi có thể được tìm thấy trong một chuỗi khác, trở về true hoặc false cho phù hợp.

từ String.prototype.includes() docs on MDM


Như một số tính năng mới nhất ECMAScript không được hỗ trợ trong tất cả các trình duyệt, bạn nên sử dụng Babel để biên dịch mã của bạn để ECMAScript 5.

2

Tôi nghĩ rằng đây có thể được đơn giản hóa rất nhiều. Đã có một built-in trong javascript để kiểm tra những thứ này. Hãy xem xét:

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 

function checker(value) { 
    var prohibited = ['banana', 'apple']; 

    // indexOf() returns -1 if the element doesn't exist in the prohibited array 
    return prohibited.indexOf(value) == -1; 
} 

arr = arr.filter(checker); 
console.log(arr); 
Các vấn đề liên quan