![](/img/trans.png)
[英]Check if an array contains any element of another array with some null in JavaScript
[英]Check if a string contains any element of an array in 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'
應該被刪除,但事實並非如此。
上面的代碼只過濾了“香蕉”,而不是“蘋果”。 我有很多關鍵字要過濾。 有沒有更簡單的方法?
可以這么簡單:
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
使用箭頭函數。
!
意味着它將排除所有不滿足條件的元素。
some()
方法測試數組中的某個元素是否通過提供的函數實現的測試。
來自MDM 上的Array.prototype.some()
文檔
includes()
方法確定是否可以在另一個字符串中找到一個字符串,並根據需要返回true
或false
。
來自MDM 上的String.prototype.includes()
文檔
由於並非所有瀏覽器都支持某些最新的 ECMAScript 功能,因此您應該使用Babel將代碼編譯為 ECMAScript 5。
問題在於 for 循環,它只迭代一次,因為 return 結束了函數,在這個過程中切斷了 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()
方法
'every' 方法為數組中存在的每個元素執行一次提供的回調函數,直到找到一個回調函數返回假值(轉換為布爾值時變為假的值)。 如果找到這樣的元素,every 方法會立即返回 false。 否則,如果回調為所有元素返回真值,則每個元素都將返回真值。 僅對已分配值的數組索引調用回調; 不會為已刪除或從未分配值的索引調用它。( 取自此處)
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);
對於較舊的瀏覽器, 請檢查每種方法的 polyfill 選項。
您甚至可以在這里使用正則表達式。 使用數組生成正則表達式並使用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);
請參閱此字符串到正則表達式轉換的答案: 您可以使用字符串變量動態創建 JavaScript正則表達式嗎?
我認為這可以大大簡化。 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);
有些人可能會爭辯說這是一個有問題的做法,但您可能會發現擁有一個可以直接在字符串上運行的方法很有用 - 在這種情況下,您可以使用String.prototype擴展 JavaScript String對象。
像這樣...
String.prototype.containsAny = String.prototype.containsAny || function(arr) { for (var i = 0; i < arr.length; i++) { if (this.indexOf(arr[i]) > -1) { return true; } } return false; };
正如您在此示例中看到的,它將默認為containsAny
方法的任何現有定義。 記住:任何時候你增加內置對象時,最好至少先檢查屬性是否存在——也許有一天它會存在...... ¯\\_(ツ)_/¯
查看這個小提琴的用法或見下文:
var str = 'This is a sentence as a string.'; console.log(str.containsAny(['string1', 'string2', 'string3'])); // -> returns false console.log(str.containsAny(['string', 'string1', 'string2'])); // -> returns true
<script src="//cdn.simpledigital.net/common/js/extensions/String.prototypeHelpers.js"></script>
對於尋找簡單單線的人:
arr.filter(item => !prohibited.some(prohb => item.includes(prohb))) // ["kiwi", "orange"]
您可以使用some()
函數:檢查字符串是否包含數組的任何元素。
例如
var fruitsArr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange'];
var myString = "I have an apple and a watermelon.";
var stringIncludesFruit = fruitsArr.some(fruit => myString.includes(fruit));
這個功能很新。 some()
方法接受一個回調,您可以在其中定義要驗證的條件並返回一個布爾值。 檢查上面鏈接中的文檔。
例如,通過構建一個 RegExp 並對其進行測試:
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) });
const stringInput = "I have a kiwi";
const arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange'];
const exists = arr.some((t) => stringInput.indexOf(t) > -1);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.