【问题标题】:How to search a string for all values contained in an Array of strings? (Javascript)如何在字符串中搜索字符串数组中包含的所有值? (Javascript)
【发布时间】:2012-02-16 00:25:28
【问题描述】:

我正在尝试了解是否有 javascript 方法来搜索字符串以查看该字符串是否包含字符串数组中的任何值。

一个例子是:

var a = 'How now brown cow';
var b = new Array('red', 'green', 'brown');

结果函数将返回 true,因为单词 brown 包含在字符串 a 中。

更具体地说,我正在尝试做的事情(使用表单输入中的值除外)是:

var a = '12345@gmail.com';
var b = new Array('.com', '.net', '.org');

这也应该返回 true。然后基于此,我将继续接受var a 为有效。

我现在的实际代码(总是返回null)如下:

function check_domain(){
  for(var i=0; i<domains.length; i++){
    var d = domains[i];
    if(elemen.value.indexOf(d) != d){
      return null;
    }
    else{
      vEmail.style.visibility = 'visible';
    }
  }
}

  window.domains = new Array(....Array values here....);

【问题讨论】:

  • 顺便说一句,您不应该真正使用 window 对象来存储变量。
  • 仅供参考,[...] 语法优于 new Array(...) 语法,除非您想创建一个包含一定数量未定义元素的新数组(在这种情况下,您将使用 new Array(n) 表示 @ 987654332@ 元素)。除此之外,您的代码会泄漏全局变量,例如,您真的应该在 check_domain() 函数中使用 var i - 您真的不希望任何循环变量成为全局变量!
  • @ThiefMaster 我修复了var i 问题,但数组不是空的,我只是将其留空并写下我所做的,因为它有超过 100 个字符串,占用了大量空间与问题无关。
  • @Jivings 为什么不呢?以及我应该怎么做才能避免它。我的代码发生了很多这样的事情,因为我使用addEventListener 方法来调用所有函数。每当用户单击页面时,有关该元素的所有信息都会存储为elemen;当他们单击其他内容时,elemen 的值会自动更改为单击的新元素。我应该将变量声明为全局变量并像那样使用它们吗?我很困惑,因为人们一直告诉我不要使用全局变量,但我不知道如何避免它并仍然实现我的代码的目的。
  • 对不起 PTBN :) 你最好只在范围顶部用 var 声明它们。如果您对改进 JavaScript 感兴趣,请查看 closuresself invoking functions 以控制范围。

标签: javascript arrays string search validation


【解决方案1】:

您可以从数组中创建正则表达式:

var re = new RegExp(domains.join('|').replace(/\./g,'\\.'));

然后你可以测试一个字符串:

var a = '12345@gmail.com';
var found = re.test(a);

【讨论】:

  • 你能进一步解释一下join('|')replace(/\./g,'\\.')吗?
  • @Proud_to_be_Noob:join 方法从数组中生成一个类似于".com|.net|.org" 的字符串,然后替换将每个. 转换为\.,因为这就是您在一个正则表达式。
【解决方案2】:

不知道为什么你有.indexOf(d) != d。不应该是:

function check_domain(){
   var d, i;
   for(i = 0; i < domains.length; i++){
      d = domains[i];
      if(elemen.value.indexOf(d) != -1) {
        return true;
      }
   }
}

【讨论】:

  • 哦,是的,哈哈不知道我为什么这样做,我的错,我在想一个不同的方法,但写了indexOf。谢谢,这解决了问题。
【解决方案3】:

是的,有一种叫做正则表达式的东西,如果你真的需要它来匹配数组中的值,你可以创建一个循环并根据字符串检查每个单词,如下所示:

var a = 'How now brown cow';
var b = new Array('red', 'green', 'brown');

function Check(target, lookFor)
{
    for(var I = 0, L = lookFor.length; I <= L; I++)
        if(new RegExp(lookFor[I]).test(target))
            return true;
    return false;
}

alert(Check(a, b));

但就您而言,解决此问题的最佳方法是将目标字符串中要查找的所有单词仅加入一个正则表达式中,这样您就可以避免使用循环。

if(/(\.com|\.net|\.org)$/.test("sfdsdfsdf@gmail.com"))
{
// Valid email
}
else
{
// Invalid email
}

【讨论】:

  • 您使用大写循环变量的任何原因?虽然这主要是风格问题,但我认为几乎每个人都使用小写的ijkiijj 来表示循环变量。而且我认为缓存.length 值并不是真正必要的——很可能存储了数组中的元素数量,因此访问它是O(1),就像访问缓存它的变量一样。
  • 完全没有理由,我一直这样做是出于习惯,但我认为这并不重要,对吧?缓存长度也是如此。
猜你喜欢
  • 1970-01-01
  • 2013-06-26
  • 2013-11-10
  • 2011-05-25
  • 1970-01-01
  • 2019-07-12
  • 2021-09-27
  • 2011-07-22
相关资源
最近更新 更多