2016-05-25 131 views
15

如何檢查字符串是否包含數組的任何元素?如果元素有一些字符串,我想過濾一些數組。請參閱下面的代碼。檢查一個字符串是否包含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);

結果是[ 'apple', 'kiwi', 'orange' ]'apple'應該被刪除,但不是。

上面的代碼只是過濾'香蕉',而不是'蘋果'。我有很多關鍵字要過濾。有更容易的方法嗎?

回答

15

問題出在for循環,它只會迭代一次,因爲返回結束函數,切斷進程中的for循環。因此,您可以像這樣更新代碼,以使該函數只在for循環完成後纔會返回。

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


爲了減少功能,您可以使用every()indexOf()方法

的 '每一個' 方法爲每執行一次提供的回調函數元素存在於陣列中直到找到回調函數返回一個虛假值(在轉換爲布爾值時變爲false)爲止。如果找到這樣的元素,則每個方法立即返回false。否則,如果回調函數爲所有元素返回一個真值,則每個元素都將返回true。僅對已分配值的數組索引調用回調;它不爲其調用已被刪除或從未被分配值指標。(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);


對於較舊的瀏覽器check polyfill option of every method


你甚至可以在這裏使用正則表達式。使用陣列生成的正則表達式,並使用test()檢查匹配

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

參考這個答案字符串正則表達式轉換:通過建立一個RegExp 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

我沒有看到jQuery在任何問題中提到的任何地方由OP,還有一些解釋「你的代碼如何工作」將有所幫助。 –

+1

沒有提到JQuery,但提問者要求定義一些更簡單的方法,以便他能夠輕鬆理解。代碼運行良好,因爲我已經測試過它。 **每個**功能類似於** foreach **,所以嵌套每個都可以解決問題 –

+0

當然,這將工作,毫無疑問,但我們不應該提供JavaScript問題的jQuery答案。 –

0

例如和測試:

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

它可以是如此簡單:

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使用an arrow function

!意味着它將排除所有不符合條件的元素。

some()方法測試所述陣列中的一些元件是否通過由提供的功能來實現的測試。

Array.prototype.some() docs on MDM

includes()方法確定是否一個字符串可能另一個字符串中找到,返回truefalse適當。

String.prototype.includes() docs on MDM


由於一些最新的ECMAScript功能無法在所有的瀏覽器都支持,您應該使用Babel編譯代碼在ECMAScript 5

2

我認爲這是可以大大簡化。 JavaScript中已經內置了用於檢查這些內容的內容。考慮:

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); 
相關問題