簡體   English   中英

Javascript - 如何在一個條件下檢查字符串是否包含多個子字符串

[英]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);

參考.every() function & Boolean function

我只能這么想:

 '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.

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