检查数组中的任何元素是否包含字符串的一部分

Javascript: Check if any elements in an array contain a part of a string

本文关键字:包含 字符串 一部分 是否 任何 数组 检查 元素      更新时间:2023-09-26

我有一组"被禁止的域名",我试图找到一种简单的方法来检查特定的电子邮件是否来自这些域名之一。考虑以下内容:

var bannedDoms = ["gmail.com", "hotmail.com", ".le.salesforce.com"]
if(bannedDoms.indexOf(email.split("@")[1]) === -1){
   // It's a good domain!
}

这很好,除了最后一个例子,因为salesforce电子邮件来自奇怪的域,如 emailtosalesforce@t-1l9sefi2sef5wlowk59bvm0uuh78mkdfuhioamfu7vxv8agjjh.o-h7zieac.na17.le.salesforce.com -共同的因素是他们都有.le.salesforce.com在地址。

通过Array.prototype.indexOf()搜索是一个相当优雅的解决方案,如果可能的话,我想使用类似的东西-但也要捕获字符串的部分,而不是整个字符串匹配。

在Javascript中做到这一点的最有效和最简单的方法是什么?

我会选择一个正则表达式:

/gmail'.com|hotmail'.com|'le'.salesforce'.com/.test("emailtosalesforce@t-1l9sefi2sef5wlowk59bvm0uuh78mkdfuhioamfu7vxv8agjjh.o-h7zieac.na17.le.salesforce.com")

小提琴在这里

var bannedDoms = ["gmail.com", "hotmail.com", ".le.salesforce.com"];
r=new RegExp(bannedDoms.map(function(x){ return x.replace(/'./g,'''.') }).join("|"));

解释:

您可以简单地构建一个正则表达式,取每个禁止域并将它们与or组合。最简单的形式是a|b读取 a or b。原则上,gmail.com or hotmail.com会变成gmail.com|hotmail.com——只有一个例外:.是正则表达式中的一个特殊字符,意思是 any character。为了避免这种情况,我们需要将escape点设置为'.

r=new RegExp(bannedDoms.map(function(x){ return x.replace(/'./g,'''.') }).join("|"));

array. prototype.map()是一个函数,它将函数应用到数组的每个元素上——返回结果数组。

映射部分所做的不过是用转义版本'.替换每一个出现的.

Array.prototype.join()用管道连接生成的数组元素 = or

感谢@torazaburo

我认为你必须反复测试像

这样的域

var bannedDoms = ["gmail.com", "hotmail.com", ".le.salesforce.com"];
function isBanned(email) {
  var domain = email.split("@")[1];
  var banned = bannedDoms.some(function(value) {
    return domain.indexOf(value) > -1;
  })
  if (!banned) {
    // It's a good domain!
  }
  snippet.log(email + ' : ' + banned);
}
isBanned('asdf@gmail.com');
isBanned('asdf@hotmail.com');
isBanned('asdf@.le.salesforce.com');
isBanned('asdf@abc.com');
isBanned('asdf@test.com');
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

可能是endsWith模拟的一个很好的候选:

var bannedDoms = ["gmail.com", "hotmail.com", ".le.salesforce.com"];
var email1 = "emailtosalesforce@t-asd.o-h7zieac.na17.le.salesforce.com";
var email2 = "emailtosalesforce@t-asd.o-h7zieac.na17.le.salesforce.net";
console.log(bannedDoms.some(function (e) {
    return email1.indexOf(e, email1.length - e.length) !== -1;
})); // true
console.log(bannedDoms.some(function (e) {
    return email2.indexOf(e, email2.length - e.length) !== -1;
})); // false

我认为你必须做一个字符串indexOf,如果你想捕捉那些。所以,你可以尝试这样做…

var bannedDoms = ["gmail.com", "hotmail.com", ".le.salesforce.com"]
for(var i=0; i<bannedDoms.length; i++) {
    if(email.indexOf(bannedDoms[i]) === -1){
         // It's a good domain!
    }
}