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

如何基于特定词汇对Materialize CSS Autocomplete的Google联系人数据进行排序

解决Materialize Autocomplete联系人排序问题

我来帮你搞定这个排序需求!核心是先实现一个自定义排序逻辑,再把它正确应用到Materialize的Autocomplete组件里。下面是一步步的解决方案:

1. 从Google联系人获取数据(Google Apps Script端)

首先写个GAS函数拉取所有联系人的全名,处理可能的空值情况:

function getContactNames() {
  const contacts = ContactsApp.getContacts();
  return contacts.map(contact => {
    // 优先取全名,没有的话拼接名和姓
    const fullName = contact.getFullName();
    return fullName ? fullName : `${contact.getGivenName()} ${contact.getFamilyName()}`;
  }).filter(name => name); // 过滤掉空名称,避免异常
}

2. 实现自定义排序逻辑

我们需要的排序规则是:含指定关键词(比如"Mobile")的联系人排顶部,其余按字母序(不区分大小写)排列。写一个通用的排序函数:

const SORT_KEYWORD = "Mobile"; // 可根据需求修改关键词

function customSort(a, b) {
  // 判断两个联系人姓名是否包含关键词
  const aHasKeyword = a.includes(SORT_KEYWORD);
  const bHasKeyword = b.includes(SORT_KEYWORD);

  // 优先级:含关键词的排前面
  if (aHasKeyword && !bHasKeyword) return -1;
  if (!aHasKeyword && bHasKeyword) return 1;

  // 同一组内按字母序排序(不区分大小写更友好)
  return a.toLowerCase().localeCompare(b.toLowerCase());
}

3. 配置Materialize Autocomplete(前端HTML)

把排序逻辑应用到Autocomplete组件,这里有两种方式:要么先把联系人数据排序好再传给组件,要么在组件的sortFunction里动态处理。推荐两种结合,确保初始列表和用户输入时的排序都符合要求:

<!DOCTYPE html>
<html>
<head>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
</head>
<body>
  <div class="input-field">
    <input type="text" id="autocomplete-input" class="autocomplete">
    <label for="autocomplete-input">选择联系人</label>
  </div>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
  <script>
    // 从GAS后端拉取联系人数据
    google.script.run.withSuccessHandler(contacts => {
      const SORT_KEYWORD = "Mobile";

      // 复用排序函数
      function customSort(a, b) {
        const aHas = a.includes(SORT_KEYWORD);
        const bHas = b.includes(SORT_KEYWORD);
        if (aHas && !bHas) return -1;
        if (!aHas && bHas) return 1;
        return a.toLowerCase().localeCompare(b.toLowerCase());
      }

      // 把联系人数组转成Materialize Autocomplete要求的键值对格式
      const sortedContacts = contacts.sort(customSort);
      const autocompleteData = sortedContacts.reduce((acc, name) => {
        acc[name] = null; // 如果需要显示头像,可以把值换成联系人头像URL
        return acc;
      }, {});

      // 初始化Autocomplete组件,同时设置动态排序函数
      const autocompleteElems = document.querySelectorAll('.autocomplete');
      M.Autocomplete.init(autocompleteElems, {
        data: autocompleteData,
        // 用户输入时,建议列表也按我们的规则排序
        sortFunction: function(a, b, inputString) {
          return customSort(a, b);
        }
      });
    }).getContactNames();
  </script>
</body>
</html>

为什么之前的sortFunction可能没生效?

Materialize的sortFunction参数接收三个值:a、b(待排序的两个选项文本)和inputString(用户当前输入的内容)。如果之前的写法没有优先判断关键词的存在性,或者排序逻辑的返回值不符合要求(必须是-1、0、1),就会导致排序失效。上面的写法明确处理了优先级,同时保证字母序的正确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 16:52:49