簡體   English   中英

檢查字符串是否包含 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()方法確定是否可以在另一個字符串中找到一個字符串,並根據需要返回truefalse

來自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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM