如何通过匹配两个具有相似字符的值来返回字符串?

时间:2018-11-22 07:01:40

标签: javascript

问题标题没有太大帮助。让我解释一下:对于搜索功能,我使用下面的代码返回与搜索查询匹配的项目:

$ sudo add-apt-repository universe
$ sudo apt install gnome-tweak-tool
$ sudo apt  update
$ gnome-tweaks

在某些情况下,如果包含土耳其语字符的查询字符串的值为DİĞER,反之亦然,我需要返回其值为 DIGER 的项目。

我尝试过

filter(value: string, query: string): boolean {
      return value.toLowerCase().indexOf(query.toLowerCase()) > -1;
   }

filteredItems() {
      return this.items.filter(i => this.filter(i.value, this.queryString));
   }

不能完全按照我的要求工作,它只能转换土耳其语字符,但找不到任何解决方案。我将如何完成这样的任务?

2 个答案:

答案 0 :(得分:1)

问题似乎是value.toLowerCase()可能仍包含土耳其语,因此如果新的query仅搜索英文字符,则可能在新的value中找不到它。 / p>

一种选择是将valuequery都使用无条件转换为英文字符,然后可以使用includes进行检查如果新的value(大海捞针).includesquery(针):

const chars = {
  ğ: 'g',
  ş: 's',
  ö: 'o',
  ü: 'u',
  ı: 'i',
  ç: 'c',
};
const convert = str => str
  .replace(/[ğşöüıç]/g, char => chars[char])
  .toLowerCase();


filter(value: string, query: string): boolean {
  const [replacedValue, replacedQuery] = [value, query].map(convert);
  return replacedValue.includes(replacedQuery);
}

答案 1 :(得分:0)

@CertainPerformance的答案并非在所有情况下都是正确的。有一种解决此问题的官方有效方法。 String.toLocalLowerCase()方法;

function filter(value: string, query: string): boolean {
    return value.toLocaleLowerCase('tr-TR')
        .indexOf(query.toLocaleLowerCase('tr-TR')) > -1;
   }

// ------- Test Code ----------
console.log(filter('Şaban', 'şa'));  //true
console.log(filter('çoban', 'ço'));  //true
console.log(filter('ağa', 'aĞa'));   //true
console.log(filter('Ömer', 'Öm'));   //true
console.log(filter('Işıl', 'ıŞIl'));  //true
console.log(filter('Ümit', 'ümİt'));  //true

如果不提供'tr-TR'参数,它将自动查看浏览器的语言设置,但有时在将'I'转换为'ı'时会给出错误的结果。