是否可以使用排序器搜索字符串?

问题描述 投票:0回答:2

我目前正在创建一种通过查询字符串过滤项目的机制。

我想将其转换为区域设置感知版本(基本上,英语中不区分大小写,但也适用于日语假名):

return items.filter((item) => {
  return item.name.indexOf(query) !== -1;
});

我听说过ES6

Intl.Collation
,如果它能达到我的目标我想使用它。

javascript collation
2个回答
0
投票

以下内容适用于法语,也可能适用于日语:

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

参见。 https://github.com/adobe/react-spectrum/blob/7f63e933e61f20891b4cf3f447ab817f918cb263/packages/%40react-aria/i18n/src/useFilter.ts#L58


0
投票

感谢@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) // ...
© www.soinside.com 2019 - 2024. All rights reserved.