【问题标题】:JS - jQuery inarray ignoreCase() and contains()JS - jQuery inarray ignoreCase() 和 contains()
【发布时间】:2012-07-14 20:44:29
【问题描述】:

嗯,我是一个 PHP 人,我的 JS 技能除了简单的设计相关操作之外的任何 JS 都几乎没有,所以如果我问的很明显,请原谅。

以下操作在 PHP 中将是一件轻而易举的事(也可能在 JS 中 - 但我在这里与不熟悉的语法作斗争......)

这是某种输入验证

var ar = ["BRS201103-0783-CT-S", "MAGIC WORD", "magic", "Words", "Magic-Word"];

    jQuery(document).ready(function() {
        jQuery("form#searchreport").submit(function() {
        if (jQuery.inArray(jQuery("input:first").val(), ar) != -1){ 
                jQuery("#contentresults").delay(800).show("slow");

            return false;
          }

这个问题有两部分。

  • 1 - 如何使数组不区分大小写?

例如- BRS201103-0783-CT-S 将给出与 brs201103-0783-ct-s AND Brs201103-0783-CT-sMAGIC magic Magic MaGIc 相同的结果

基本上我需要类似 ignoreCase() 的数组,但我在 jQuery 和 JS 中找不到任何引用...

我试过toLowerCase() - 但它不能在阵列上工作(ittirating??)而且,它会解决混合情况吗?

  • 2 - 如何使该功能仅识别零件或 元素的组合?

例如- 如果只有一种类型 "word" ,我希望它作为 "words" 传递,并且如果有人键入 "some word" 它应该传递(包含“单词”)

【问题讨论】:

  • 对于 1,我只需将您的 JS 数组输入小写,然后调用 if (jQuery.inArray(jQuery("input:first").val().toLowerCase(), ar) != -1){,问题的第二部分似乎有点过于宽泛。具体规则是什么? word 包含在 words 中可以,但 some word 不包含在 words 中。
  • 感谢您的评论,我的意思是some word 包含word 并且words 包含word(字符串的一部分...)
  • 好吧,最奇怪的事情。输入val().toLowerCase() 将适用于“magic/MAgIc”之类的单词 - 但现在无论我如何输入字符串BRS201103-0783-CT-S(小写字母、大写字母或混合......
  • 很可能是因为magic 在您的数组中是小写的,而BRS201103-0783-CT-S 不是。检查亚历克斯的答案,他发布了一个简单的函数来将你的整个数组传递给小写。 :)
  • 好的,我现在正在检查它,但只是为了更好地理解,如果我的数组都是小写的,那么每个输入案例都会通过吗?

标签: javascript jquery arrays contains case-insensitive


【解决方案1】:

第 1 部分

您可以将您的数组处理为完全小写,并将您的输入小写,这样indexOf() 将像执行不区分大小写的搜索一样工作。

您可以使用toLowerCase() 将字符串小写,正如您已经知道的那样。

要做一个数组,你可以使用...

arr = arr.map(function(elem) { return elem.toLowerCase(); }); 

第 2 部分

您可以检查子字符串,例如...

// Assuming you've already transformed the input and array to lowercase.
var input = "word";
var words = ["word", "words", "wordly", "not"];

var found = words.some(function(elem) { return elem.indexOf(input) != -1; });

或者,您可以在此实例中跳过将数组转换为全小写,方法是在检查 indexOf() 之前对每个 elem 调用 toLowerCase()

some()map() 在较旧的 IE 中不受支持,但对于 polyfill 来说是微不足道的。链接文档中提供了每个 polyfill 的示例。

正如Fabrício Matté 还指出的那样,您可以在此处使用 jQuery 等效项,$.map() 用于Array.prototype.map()$.grep()length 属性用于Array.prototype.some()。然后您将免费获得浏览器兼容性。

【讨论】:

  • 由于 OP 有使用 PHP 的经验,不妨补充一点,JS 的 indexOf() 与 PHP 的 strpos 工作方式类似,除了 indexOf 返回 -1 不匹配而不是 false 为PHP 确实如此,语法/参数略有不同。
  • @alex 。谢谢 。尽管你的回答看起来很合乎逻辑,但第一部分对我不起作用(也许我应用错了??) - 它在较低时返回 true,但在上部仍然为 false .. 我把它当作新的 VAR @987654347 @ 然后if (jQuery.inArray(jQuery("input:first").val(), arr) != -1) (请注意,我的原始数组被称为“ar”而不是“arr”。是罪魁祸首吗?
  • 您仍然需要在输入的value 上调用toLowerCase(),例如jQuery("input:first").val().toLowerCase().
  • .. 愚蠢的小我。我从@Fabrício Matté 回复那里得到了它,然后删除了 .谢谢,一切都很好。更重要的是-我实际上学到了一些东西:-)(在说它不起作用之前仔细检查大师的代码:-))
  • 我也会 +1,我不知道 .map() 是在 JS 1.6 中实现的。使用 jQuery 的 .map() 将提供与原生 JS .map 不兼容的 IE6-8 的兼容性。
【解决方案2】:

为了检查数组是否包含不区分大小写的元素,我使用了以下代码:

    ret = $.grep( array, function (n,i) {
        return ( n && n.toLowerCase().indexOf(elem.toLowerCase())!=-1 );
    }) ;

这是一个可以玩的小提琴 array match case insensitive

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    相关资源
    最近更新 更多