我目前正在创建一种通过查询字符串过滤项目的机制。
我想将其转换为区域设置感知版本(基本上,英语中不区分大小写,但也适用于日语假名):
return items.filter((item) => {
return item.name.indexOf(query) !== -1;
});
我听说过ES6
Intl.Collation
,如果它能达到我的目标我想使用它。
以下内容适用于法语,也可能适用于日语:
const collator = new Intl.Collator('en', { sensitivity: 'base', usage: 'search' });
function contains(string, substring) {
if (substring.length === 0) {
return true;
}
string = string.normalize('NFC');
substring = substring.normalize('NFC');
let scan = 0;
for (; scan + substring.length <= string.length; scan += 1) {
const slice = string.slice(scan, scan + substring.length);
if (collator.compare(substring, slice) === 0) {
return true;
}
}
return false;
}
例如。
contains("à point", "a point")
true
感谢@charles-at-stack。我尝试改进和优化他/她的答案:
const searchCollator = new Intl.Collator('en', {usage: 'search'})
function contains(string, subString) {
const upperBound = string.length - subString.length + 1
for (let i = 0; i < upperBound; i++)
if (!searchCollator.compare(string.slice(i, i + subString.length), subString)) return true
return false
}
normalize()
是个好主意。但我认为我们应该将其职责委托给该函数的使用者。
对于 TypeScript,只需将
string
类型添加到参数中:
function contains(string: string, subString: string) // ...