![](/img/trans.png)
[英]Javascript - How to check if a string contains multiple substrings
[英]Javascript - How to check if a string contains multiple substrings in one condition
我想創建一個 if 條件來檢查字符串是否包含兩個關鍵字,例如我有這個 str: initcall7773107b-7273-464d-9374-1bff75accc15TopCenter
如何檢查這個 str 是否包含: initcall
&& TopCenter
另外還有另一個字符串必須添加到條件所以場景將是這樣的if(first_str.includes('initcall','TopCenter') && second_str.includes('start', 'BottomLeft') { // Do somthig })
搜索后我發現如何檢查一個關鍵字是否包含在字符串中而不是兩個或使用 regExp,所以我需要檢查一個字符串中的兩個單詞並在條件中添加另一個參數,如上所述。
這個語句sub1.map(string => str.includes(string)).every(Boolean)
基本上是從 sub1 數組中獲取每個字符串並檢查它是否包含在原始字符串 str 中,創建一個布爾數組 the.every () 通過調用 boolean function 來評估布爾數組,它將整個語句評估為單個 boolean。
var str = "initcall7773107b-7273-464d-9374-1bff75accc15TopCenter";
var sub1 = ["initcall","TopCenter"];
var sub2 = ["start","BottomLeft"]
var n = sub1.map(string => str.includes(string)).every(Boolean) && sub2.map(string => str.includes(string)).every(Boolean);
console.log(n);
我只能這么想:
'use strict'; String.prototype.includes = function (...args) { return args.filter(str => this.indexOf(str) > -1).length === args.length; }; var str = 'initcall7773107b-7273-464d-9374-1bff75accc15TopCenter'; if(str.includes('initcall', 'TopCenter')) { console.log('Do something...'); }
如果傳遞給它的方法返回false
, .every()
將立即停止處理。 上述建議檢查傳遞給.map()
的方法,該方法無條件地在每個元素上運行。 為什么不只使用.every()
以便更快地找到負面結果?
這是一些將演示的注入:
let counter;
const includesAllWithMap = (s, ...args) => args.map((v) => {
counter += 1;
return s.includes(v);
}).every(Boolean);
const includesAllWithJustEvery = (s, ...args) => args.every((v) => {
counter += 1;
return s.includes(v);
});
counter = 0;
rc = includesAllWithMap('abcdef', 'ab', 'cd', 'ba', 'ef', 'a', 'c');
console.log('result with map =', rc, 'number of comparisons =', counter);
// result with map = false number of comparisons = 6
counter = 0;
rc = includesAllWithJustEvery('abcdef', 'ab', 'cd', 'ba', 'ef', 'a', 'c');
console.log('result with just every =', rc, 'number of comparisons =', counter);
// result with map = false number of comparisons = 3
為了簡潔:
const includesAll = (s, ...args) => args.every(v => s.includes(v));
> includesAll('abcdef', 'ab', 'cd', 'ba', 'ef', 'a', 'c')
// false
> includesAll('abcd', 'a', 'd')
// true
如果您想在 arrays 中提供子字符串,您可以稍作更改,正如原始海報所希望的那樣:
const includesAll = (s, ...args) => args.flat().every(v => s.includes(v));
> includesAll('abcdef', ['ab', 'cd', 'ba'], ['ef', 'a', 'c'])
// false
> includesAll('abcd', ['a', 'd'])
// true
> includesAll('abcdef', ['ab', 'abc'], ['de'], ['bcd'])
// true
如果你想要兩者:
const includesAll = (s, ...args) => args.every(v => s.includes(v));
const includesAllinArrays = (s, ...args) => includeAll(s, args.flat());
如果你想要一個一體機(犧牲一些效率):
const includesAll = (s, ...args) => args
.map(a => Array.isArray(a) ? a.flat() : [a])
.flat()
.every(v => s.includes(v));
> includesAll('abcdef', 'ab', 'abc', ['d'], ['d', 'e'], 'cd')
// true
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.