You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue.js Bootstrap Vue表格土耳其字符搜索大小写匹配异常问题

土耳其字符的Bootstrap Vue表格搜索匹配问题

表格中存在İstanbul这类土耳其字符数据,输入小写istanbul无法匹配结果,仅输入大写İstanbul才能找到对应条目。尝试使用toLocaleLowerCase()方法未生效。


相关代码片段

模板与数据集

<template>
  <div>
    <b-table striped hover :fields="fields" :items="cities"></b-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      cities: [
        { key: 1, city: 'İstanbul' },
        { key: 2, city: 'İzmir' },
        { key: 3, city: 'Adana' },
      ],
      cityCopyArray: [
        { key: 1, city: 'İstanbul' },
        { key: 2, city: 'İzmir' },
        { key: 3, city: 'Adana' },
      ],
      fields: ["city"]
    }
  }
}
</script>

输入框代码

<input
:placeholder="'City Name'"
:id="'cityNamr'"
v-model="citySearchSearch"></input>

Watch监听代码

citySearchSearch: {
  handler(val) {
    this.cities = this.cityCopyArray.filter((city) => {
      return this.converter(city.name).includes(this.converter(val))
    })
  },
},

字符转换函数代码

converter(text){
  var trMap = {
    'çÇ':'c',
    'ğĞ':'g',
    'şŞ':'s',
    'üÜ':'u',
    'ıİ':'i',
    'öÖ':'o',
  };
  for(var key in trMap) {
    text = text.replace(new RegExp('['+key+']','g'), trMap[key]);
  }
  return  text.replace(/[^-a-zA-Z0-9\s]+/ig, '')
      .replace(/\s/gi, "-")
      .replace(/[-]+/gi, "-")
      .toLowerCase();
},

问题修复方案

1. 修正字段名错误

监听逻辑中使用了city.name,但数据集里的城市字段实际是city.city,这会导致过滤逻辑完全失效,需改为city.city。

2. 优化土耳其字符转换逻辑

原转换函数的正则处理存在缺陷,且toLocaleLowerCase()未指定土耳其语环境,导致字符转换不彻底。修改后的转换函数:

converter(text) {
  if (!text) return '';
  // 指定土耳其语环境进行大小写转换
  let normalized = text.toLocaleLowerCase('tr-TR');
  // 替换土耳其特殊字符为英文对应字符
  const trMap = {
    'ç': 'c',
    'ğ': 'g',
    'ş': 's',
    'ü': 'u',
    'ı': 'i',
    'ö': 'o'
  };
  for (const [char, replacement] of Object.entries(trMap)) {
    normalized = normalized.replace(new RegExp(char, 'g'), replacement);
  }
  // 清理多余字符(可根据需求调整)
  return normalized.replace(/[^a-z0-9\s]/g, '')
                   .replace(/\s+/g, '-')
                   .replace(/-+/g, '-');
}

3. 完善监听逻辑

添加空输入判断,避免空值导致的异常,同时优化性能:

citySearchSearch: {
  handler(val) {
    // 输入为空时恢复原始数据
    if (!val) {
      this.cities = [...this.cityCopyArray];
      return;
    }
    const searchStr = this.converter(val);
    this.cities = this.cityCopyArray.filter(city => {
      return this.converter(city.city).includes(searchStr);
    });
  },
  immediate: true // 初始化时执行一次过滤
}

4. 修正输入框语法错误

输入框的placeholder和id存在多余引号,修正为:

<input
  placeholder="City Name"
  id="cityName"
  v-model="citySearchSearch"
/>

修改完成后,输入istanbul即可正确匹配到İstanbul条目。

内容的提问来源于stack exchange,提问作者user19578726

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 09:05:21