Javascript string.prototype.contains()与语言环境

Dav*_*las 6 javascript string localization

是否可以检查字符串是否包含具有语言环境支持的子字符串?

'Ábc'.contains('A') 应该是真的。

Javascript现在具有string.prototype.localeCompare(),可与区域设置支持进行字符串比较,但我看不到localeContains()对应的字符串。

Geo*_*rgy 6

你可以这样做:

String.prototype.contains = function contains(charToCheck) {
  return this.split('').some(char => char.localeCompare(charToCheck, 'en', {sensitivity: 'base'}) === 0)
}

console.log('Ábc'.contains('A')) // true
console.log('Ábc'.contains('B')) // true
console.log('Ábc'.contains('b')) //true
console.log('Ábc'.contains('u')) //false
console.log('coté'.contains('e')) //true
Run Code Online (Sandbox Code Playgroud)

localCompare上的文档。灵敏度base意味着:

“base”:只有基本字母不同的字符串比较为不相等。示例:a ? ba = áa = A


Jan*_*roň 6

有一个比 contains() 更快的替代方法,可以对字符串进行区域设置检查

\n

似乎剥离变音符号然后本地比较字符串要快得多:在我的架构上几乎比 @chickens 或 @dag0310 解决方案快 10 倍,请在此处检查您的架构。在空字符串检查时返回 true 以与String.includes

\n

\r\n
\r\n
String.prototype.localeContains = function(sub) {\n  if(sub==="") return true;\n  if(!sub || !this.length) return false;\n  sub = ""+sub;\n  if(sub.length>this.length) return false;\n  let ascii = s => s.normalize("NFKD").replace(/[\\u0300-\\u036f]/g, "").toLowerCase();\n  return ascii(this).includes(ascii(sub));\n}\n\nvar str = "142 Rozmo\xc4\x8den\xc3\xbdch K\xc5\x99\xc3\xadd";\nconsole.log(str.localeContains("k\xc5\x98i"));\nconsole.log(str.localeContains(42));\nconsole.log(str.localeContains(""));\nconsole.log(str.localeContains(false));
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

NFKD

\n

NFKD 修饰符将所有预组合字符分解为其基本字符和组合标记,随后将其删除replace调用将其删除。

\n

重要的提示

\n

这对于某些解决方案不起作用,例如"Stra\xc3\x9fe".contains("SS"),取决于您是否想\xc3\x9f考虑替代SS。要了解更多信息,请检查MDN 上提到的规范和兼容性转换提到的规范和兼容性转换,其中还提到了除 NFKD 之外的其他形式。

\n

感谢 @LukasKalbertodt 在评论中提到了边缘情况。

\n

  • 我不知道你使用的是哪种黑魔法,但它的作用就像一个咒语。谢谢! (2认同)