一尘不染

如何编写angularjs过滤器以搜索字符串片段/字符串序列

angularjs

我正在尝试编写一个angularjs自定义过滤器,以检查国家/地区数组是否包含用户输入的搜索字符串。

该字符串可以包含一个字母(例如“ E”)或n个字母的片段(例如“ lan”)或整个单词(例如“ England”)。

在每种情况下,都应返回包含该字母或该片段的所有国家,因此“ E”将返回“ England”,“爱沙尼亚”等,而“ lan”将返回“ England”,“
Ireland”等。

到目前为止,我的过滤器返回了整个国家或单个字母,但是我遇到了字符串片段的问题:

  1. HTML模板:
        <input ng-model="filter.text" type="search" placeholder="Filter..."/>

    <ul>
       <li ng-repeat="item in data | listfilter:filter.text">
    </ul>
  1. angularJS
        angular.module('sgComponents').filter('listfilter',[ function () {
    return function(items, searchText) {
        var filtered = [];            

        angular.forEach(items, function(item) {
            if(item.label === searchText) { // matches whole word, e.g. 'England'
                filtered.push(item);
            }
            var letters = item.label.split('');
            _.each(letters, function(letter) {
                if (letter === searchText) { // matches single letter, e.g. 'E'
                    console.log('pushing');
                    filtered.push(item);
                }
            });
            // code to match letter fragments, e.g. 'lan'
        });
        return filtered;
    };
    }]);

阅读 177

收藏
2020-07-04

共1个答案

一尘不染

比这简单得多,使用以下String.indexOf()函数:

angular.forEach(items, function(item) {
    if( item.label.indexOf(searchText) >= 0 ) filtered.push(item);
});

您可能需要将两个字符串都转换.toLowerCase()为不区分大小写的匹配项:

searchText = searchText.toLowerCase();
angular.forEach(items, function(item) {
    if( item.label.toLowerCase().indexOf(searchText) >= 0 ) filtered.push(item);
});
2020-07-04