首页 > 解决方案 > 通过映射的字母在不同的字母中搜索

问题描述

我有一个简单的搜索字段,我只能使用英文字母和数字进行搜索,我的目标是使搜索能够通过映射字母使用英文字母搜索不同的字母表,例如 a = α,b = μπ,g = γ等

我试图用两种语言的所有字母制作一个对象,并在使用它过滤我的数据之前过滤每个字母。

export function dataSearch(data, query) {
 if (!data || data.length === 0) return [];
 // if (/^[a-zA-Z]+$/.test(query)) detected English language  

 const lettersObj = [{a: 'α'}, {b: 'μπ'}, {g: 'γ'}]

 const newQuery = lettersObj.filter((l) => 
   Object.keys(l).join('').toLowerCase().match(query.toLowerCase())

 return data.filter((d) => {
 const dataString = Object.values(d).join('').toLowerCase();

return dataString.match(newQuery.toLowerCase());
 });
}

预期的结果是能够在这两种情况下使用 en 字母进行搜索。如果我通过映射的字母输入了非 en 的内容,我应该得到相同的结果。

标签: javascriptarraysreactjsobject

解决方案


您可以只使用一个对象,然后逐字母转换单词。然后,您可以使用 can continue Object.values,但首先检查属性是否为 a string,然后使用someandincludes检查每个属性是否包含该新单词:

const map = {a: 'α', b: 'μπ', g: 'γ'}
const data = [
  {id: 4, date: '30/08/2019', name: 'Χτένισμα', notes: null, pos: true, price: 12}
]

const search = (data, s) => {
  if (!data || data.length === 0) return [];
  
  const query = s.split('').map(l => map[l] || l).join('')

  return data.filter(d => Object.values(d).some(s => typeof s === "string" && s.includes(query)))
}

// Pass
console.log(search(data, 'a'))
console.log(search(data, '30/08'))

// Fail
console.log(search(data, 'null'))
console.log(search(data, '12'))
console.log(search(data, 'true'))


推荐阅读