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

Angular过滤器搜索列表元素时显示不匹配值问题

解决AngularJS下拉搜索匹配异常的问题

我一眼就看出问题所在了——你用的AngularJS默认filter会遍历数组中每个元素的所有属性进行模糊匹配。你的versionLi里每个条目是数组,第一个元素是类似217233的ID,这个ID里包含了"12",所以当你搜索"12"时,这些ID带"12"的条目(比如16开头的版本对应的ID)也会被误匹配出来。

下面给你两种解决方案,按需选择:

方案1:仅针对版本号字段进行模糊匹配

最简单的修正方式是让过滤器只检查版本号所在的字段(也就是数组的第1个索引位置),而不是整个数组对象。修改HTML中的ng-repeat部分即可:

<tr ng-repeat="friend in versionLi | filter : {1: searchText} ">

这里{1: searchText}表示只匹配数组中索引为1的元素(也就是版本号字符串),这样搜索"12"时,只会检查版本号里是否包含"12",不会再去匹配ID里的"12"了,完美解决误匹配问题。

方案2:实现前缀严格匹配(可选)

如果你的需求是必须以搜索文本开头(比如搜"16"只显示16开头的版本,而不是版本号里任意位置有"16"的),可以自定义一个过滤器:

首先在myApp.js中添加自定义过滤器:

var appOne = angular.module('appOne', ['ngRoute']);

// 添加自定义前缀匹配过滤器
appOne.filter('startsWith', function() {
  return function(items, searchText) {
    // 如果没有搜索内容,返回全部条目
    if (!searchText) return items;
    // 统一转小写,实现不区分大小写的匹配
    searchText = searchText.toLowerCase();
    return items.filter(function(item) {
      // 检查版本号是否以搜索文本开头
      return item[1].toLowerCase().startsWith(searchText);
    });
  };
});

appOne.controller('controllerOne', function ($scope) {
 $scope.versionLi = [
 ["217233", "16.2(2)", "0", "Class"],
 ["217220", "16.2(1.11)", "1", "Class"],
 ["212675", "16.1(0)", "2", "Class"],
 ["228973", "12.7(3)M1", "4", "Class"],
 ["228973", "12.7(4)M1", "4", "Class"],
 ["228973", "12.7(5)M1", "4", "Class"],
 ["231350", "15.9(3)", "3", "Class"],
 ["228973", "15.7(3)M1", "4", "Class"],
 ["228973", "15.7(4)M1", "4", "Class"],
 ["228973", "15.7(5)M1", "4", "Class"]
 ];
});

然后修改HTML中的过滤器为自定义的startsWith:

<tr ng-repeat="friend in versionLi | startsWith : searchText ">

这样搜索"12"时,只有版本号以"12"开头的条目才会被显示,匹配更严格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:25:23