javascript包含()不区分大小写

Leg*_*yer 19 javascript regex

假设我有一个过滤字符串数组,我需要循环并检查其他传入的字符串.

var filterstrings = ['firststring','secondstring','thridstring'];
var passedinstring = localStorage.getItem("passedinstring");

for (i = 0; i < filterstrings.lines.length; i++) {
    if (passedinstring.includes(filterstrings[i])) {
        alert("string detected");
    }
}
Run Code Online (Sandbox Code Playgroud)

我如何确保在过滤时忽略区分大小写(最好是使用正则表达式),如果var passedinstring要使用FirsTsTriNg或者字符串fiRSTStrING

Kam*_*tti 34

ES6数组方法filter()可以简单的单行解决,使用includes()方法判断数组是否包含某个值,并结合toLowerCase()方法将其转换为小写。

var filterstrings = ['firststring','secondstring','thridstring'];
var passedinstring = localStorage.getItem("passedinstring");

// convert each string from filterstrings and passedinstring to lowercase
// to avoid case sensitive issue.
filteredStrings = filterstrings.filter((str) => str.toLowerCase().includes(passedinstring.toLowerCase())
Run Code Online (Sandbox Code Playgroud)

  • 我使用了一个变体:filteredstrings = filterstrings.some(e =&gt; e.toUpperCase().includes(activeSearch.toUpperCase())) (3认同)
  • 这是一个很好的答案!这是一个非常简单的单线解决方案。我在过滤器中使用“filteredStrings”行,我只是检查封装过滤器语句中的长度是否&gt; 0 (2认同)
  • 谢谢 - 当人们用最新功能回答老问题时,我们总是很感激! (2认同)
  • 使用 [localeCompare()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare) 会更安全。简单的 `.toLowerCase()` 可能会出现问题 - 请参阅 Jon Skeet 在 YouTube 上的演示 [回到基础:我们对基本数据类型造成的混乱](https://youtu.be/l3nPJ-yK- LU?t=1266)了解更多信息。 (2认同)

vsy*_*ync 33

您可以.includes使用.some返回boolean的方法进行切换。一旦找到匹配
它就会退出,这对于大型数组的性能非常有用:

.some(item => item.toLowerCase() == lookup.toLowerCase())
Run Code Online (Sandbox Code Playgroud)

演示:

var arr = ['foo','bar','bar'];
var lookup = "bAr";

// case-sensetive
console.log( arr.includes(lookup) )

// case-insensetive without caring about the type
console.log( arr.some(x => x.toLowerCase() == lookup.toLowerCase()) ) 
Run Code Online (Sandbox Code Playgroud)


或者使用唯一的名称定义您自己的数组原型方法:

// the name ("_includes") should be unique enough not to ever be overriten 
// by future language updates or 3rd-party scripts
Array.prototype._includes = function(target){ 
  return this.some(x => x.toLowerCase() == (target||'').toLowerCase()) 
}

console.log( 
  ['foo', 'bar', 'bar']._includes("bAr") 
)
Run Code Online (Sandbox Code Playgroud)

  • 如果您在循环之外执行“lookup.toLowerCase()”,则性能可能会更好。 (3认同)

gur*_*372 23

您可以从一开始创建一个RegExpfilterstrings

var filterstrings = ['firststring','secondstring','thridstring'];
var regex = new RegExp( filterstrings.join( "|" ), "i");
Run Code Online (Sandbox Code Playgroud)

那么test如果passedinstring那里

var isAvailable = regex.test( passedinstring ); 
Run Code Online (Sandbox Code Playgroud)

  • 这不应该是一个可以接受的答案!任何寻求答案并偶然发现这个答案的人 - 请注意!对于数组中可以找到的任何子序列,这将返回“true”。```[1,2,3].includes(12) // false new RegExp([1,2,3].join("|"), "i").test(12) // true!! !["Hello","World"].includes("HelloWorld") // false \n new RegExp(["Hello", "World"].join("|"), "i").test("HelloWorld ") // 正确!!!``` (12认同)
  • 将随机字符串映射到正则表达式模式并不是一个好主意,除非您确实知道这些字符串不会包含特殊字符。 (4认同)
  • 请注意,firststringtest 也会在这里返回 true。在 ES5 中,`filterstrings.map((a) =&gt; { return a.toLowerCase() }).includes(passedinstring.toLowerCase())` 可能是这个问题的解决方案。 (3认同)
  • 必须对“filterstrings”进行转义,否则您可能会遇到正则表达式损坏或出现意外行为的风险。 (2认同)

小智 13

你可以简单地转换passedinstring为小写。

var passedinstring = localStorage.getItem("passedinstring").toLowerCase();
Run Code Online (Sandbox Code Playgroud)

  • 好吧,它适用于给定的情况,但我想我们也希望它以相反的方式工作......(即过滤后的字符串也有大写字母) (5认同)
  • 如果您也希望以其他方式工作,只需在输入的字符串上使用 toLowerCase() 即可。 (2认同)

Sau*_*try 11

将 filterstring 和 passinstring 转换为小写并进行比较

var filterstrings = ['firststring','secondstring','thridstring'];
var passedinstring = 
localStorage.getItem("passedinstring").toLowerCase();

for (i = 0; i < filterstrings.lines.length; i++) {
   if (passedinstring.includes(filterstrings[i].toLowerCase())) {
       alert("string detected");
   }
}
Run Code Online (Sandbox Code Playgroud)


Arv*_*iya 7

使用toLowerCase(). 比较时它全部string变成小写。

var product=productList.filter((x) => x.Name.toLowerCase().includes(("Active").toLowerCase()))
Run Code Online (Sandbox Code Playgroud)


DDS*_*DDS 5

我的选择是比较 UPPER 与 UPPER 或 lower 与 lower 转换两侧(我经常在 SQL 中这样做):

    var filterstrings = ['firststring','secondstring','thirDstrIng'];
    var passedinstring =  'ThIrDsTrInG3';
    
    //used for of just to make it more readable
    for (filterstring of filterstrings) {
        if (passedinstring.toUpperCase().includes(filterstring.toUpperCase())) {
            alert("string detected");
        }
    
    }

Run Code Online (Sandbox Code Playgroud)

提示string detected