解决输入框选项重复

# 解决输入框选项重复

// 输入框搜索
querySearch(queryString, cb) {
  // 获取地址列表
  var addressList = this.addressList;
  // 根据查询字符串过滤地址列表,如果没有查询字符串则返回完整地址列表
  var results = queryString
    ? addressList.filter(this.createFilter(queryString))
    : addressList;
  // 调用回调函数返回建议列表的数据
  cb(results);
},

// 创建过滤函数,根据查询字符串过滤地址
createFilter(queryString) {
  return (restaurant, index, self) => {
    // 判断地址的值是否以查询字符串开头,忽略大小写
    // 同时确保返回的地址是第一次出现的(避免重复)
    return (
      restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0 &&
      self.findIndex((r) => r.value === restaurant.value) === index
    );
  };
},

在这里,我们使用了 Array.findIndex()方法来查找当前元素在数组中的第一个位置,如果当前位置与索引 index 相等,则说明当前元素是第一次出现,否则说明是重复项,应该被过滤掉。这样就能确保返回的列表数据中不包含重复项。

注释解释:

querySearch 函数用于输入框搜索功能,接受两个参数:查询字符串 queryString 和回调函数 cb,用来返回搜索结果。 addressList 是存储地址列表的变量。 results 是用于存储搜索结果的变量,根据查询字符串进行过滤操作。 如果有查询字符串 queryString,则通过 filter 方法对 addressList 进行过滤,使用 createFilter 函数创建的过滤函数来判断是否符合过滤条件,得到过滤后的结果。 如果没有查询字符串 queryString,则直接返回完整的地址列表。 最后,调用回调函数 cb 并传入搜索结果 results,用于返回建议列表的数据。 createFilter 函数用于创建过滤函数,接受查询字符串 queryString 作为参数。 过滤函数使用箭头函数的形式定义,接受三个参数:当前的地址 restaurant、索引 index 和地址列表 self。 过滤函数判断当前地址的值是否以查询字符串开头,并且忽略大小写。 同时,还确保返回的地址是第一次出现的,通过 findIndex 方法找到第一个与当前地址值相同的地址,并判断其索引是否等于当前索引 index,如果相等则表示是第一次出现。 如果满足以上两个条件,则返回 true,表示该地址符合过滤条件,否则返回 false。