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

求助:Angular中多格式手机号实时搜索筛选函数的实现

Angular 表格实时筛选解决方案(支持多格式手机号+姓名搜索)

我来帮你搞定这个实时搜索筛选的问题!其实不用纠结复杂的正则匹配各种格式,我们可以换个更简单的思路:把所有手机号都转换成纯数字字符串来做匹配,这样不管用户输入哪种格式,只要数字对得上就能匹配到存储的标准格式手机号,同时还能兼顾姓名搜索。

实现步骤拆解

  1. 标准化手机号格式:不管是用户输入的搜索词,还是表格里存储的手机号,都先去掉所有非数字字符,统一成纯数字串再做匹配
  2. 实时触发筛选:通过keyup事件绑定筛选函数,同时支持姓名的模糊搜索
  3. 优化体验(可选):用RxJS做防抖,避免输入时频繁触发筛选

完整代码示例

组件 TypeScript 代码

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-table-filter',
  templateUrl: './table-filter.component.html',
  styleUrls: ['./table-filter.component.css']
})
export class TableFilterComponent implements OnInit {
  // 原始数据
  Details = [
    { PN: '123-456-7890', NAME: 'PERSON A' },
    { PN: '192-453-7655', NAME: 'PERSON B' },
    { PN: '555-123-4567', NAME: 'PERSON C' }
  ];
  // 搜索关键词
  searchTerm: string = '';
  // 筛选后的数据
  filteredDetails: any[] = [];

  ngOnInit(): void {
    // 初始化时显示全部数据
    this.filteredDetails = [...this.Details];
  }

  // 筛选函数
  filterData(): void {
    if (!this.searchTerm.trim()) {
      // 搜索词为空时显示全部数据
      this.filteredDetails = [...this.Details];
      return;
    }

    // 处理搜索词:去掉所有非数字字符,同时转小写用于姓名匹配
    const cleanSearchTerm = this.searchTerm.replace(/\D/g, '');
    const lowerCaseSearch = this.searchTerm.toLowerCase();

    this.filteredDetails = this.Details.filter(item => {
      // 处理表格中的手机号:去掉非数字字符
      const cleanItemPN = item.PN.replace(/\D/g, '');
      // 匹配手机号(纯数字包含)或姓名(模糊匹配)
      return cleanItemPN.includes(cleanSearchTerm) || item.NAME.toLowerCase().includes(lowerCaseSearch);
    });
  }
}

组件模板 HTML 代码

<!-- 搜索输入框 -->
<input 
  type="text" 
  placeholder="搜索手机号或姓名..."
  [(ngModel)]="searchTerm"
  (keyup)="filterData()"
  class="search-input"
>

<!-- 表格 -->
<table>
  <thead>
    <tr>
      <th>手机号</th>
      <th>姓名</th>
    </tr>
  </thead>
  <tbody>
    <tr *ngFor="let item of filteredDetails">
      <td>{{ item.PN }}</td>
      <td>{{ item.NAME }}</td>
    </tr>
  </tbody>
</table>

关键逻辑说明

  • replace(/\D/g, ''):这个正则会把字符串里所有非数字的字符(包括-)都去掉,把各种格式的手机号统一成纯数字,比如123-456-7890变成1234567890,xxx-xxxxxxx变成xxxxxxxxxx,完美解决格式不统一的问题
  • 双重匹配逻辑:既检查处理后的手机号是否包含搜索词的纯数字部分,又检查姓名是否包含搜索词(不区分大小写),满足用户的搜索需求
  • 空值处理:当搜索词为空时,自动恢复显示全部数据

可选优化:防抖处理

如果担心输入时频繁触发筛选影响性能,可以用RxJS的debounceTime来延迟触发,比如修改搜索词的绑定方式:

import { Subject } from 'rxjs';
import { debounceTime, distinctUntilChanged } from 'rxjs/operators';

// 在组件里添加
private searchSubject = new Subject<string>();

ngOnInit(): void {
  this.filteredDetails = [...this.Details];
  // 防抖:输入停止300ms后再触发筛选
  this.searchSubject.pipe(
    debounceTime(300),
    distinctUntilChanged()
  ).subscribe(term => {
    this.searchTerm = term;
    this.filterData();
  });
}

// 修改模板的keyup事件为:
// (keyup)="searchSubject.next($event.target.value)"

这样用户快速输入时不会频繁调用筛选函数,体验更流畅~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 18:22:54