过滤不包含来自其他数组的字符串的字符串?

Iva*_*own 2 javascript arrays string filtering

我想通过排除包含黑名单数组中的任何子字符串的网址来过滤网址数组。

const urls = [
'http://example.com/people/chuck', 
'http://example.com/goats/sam', 
'http://example.com/goats/billy', 
'http://example.com/goats/linda', 
'http://example.com/cows/mary', 
'http://example.com/cows/betty', 
'http://example.com/people/betty']

const blacklist = ['cows', 'goats']

let cleanUrls = [];
Run Code Online (Sandbox Code Playgroud)

我可以用 for 循环来做到这一点,但我想找到一种使用过滤器和/或减少的干净/简洁的方法。

如果我不需要遍历 x 个黑名单项目:

cleanUrls = urls.filter( url => !url.includes(blacklist[0]) )                  
                .filter( url => !url.includes(blacklist[1]) ) 
Run Code Online (Sandbox Code Playgroud)

我也不想只用 forEach 或 map 遍历黑名单,因为如果特定 url 与任何黑名单条目匹配,我想立即停止。

请简单的JS。谢谢你。:)

Moh*_*man 6

你可以这样使用filter()

const cleanUrls = urls.filter(u => blacklist.every(s => !u.includes(s)));
Run Code Online (Sandbox Code Playgroud)

或者

const cleanUrls = urls.filter(u => !blacklist.some(s => u.includes(s)));
Run Code Online (Sandbox Code Playgroud)

描述:

  • .includes() 将检查带有另一个字符串的子字符串是否存在。
  • .every()将检查blacklist特定 URL 中是否不存在任何数组字符串。
  • .some()将检查blacklist特定 URL 中是否存在任何数组字符串。
  • .filter() 将只选择那些将通过测试的 URL。

演示:

const cleanUrls = urls.filter(u => blacklist.every(s => !u.includes(s)));
Run Code Online (Sandbox Code Playgroud)

文档: