自定义过滤器仅搜索多个关键字的特定字段

时间:2014-05-03 15:41:27

标签: javascript angularjs

我在ngrepeat上有一个自定义过滤器,只需要搜索特定字段中的单词。我得到了正确的工作,如下面的代码所示。问题是我还需要它不仅可以使用一个单词,还可以使用多个单词。因此,例如,如果我有一个带有word1和word2的数组,我需要在任何指定的字段中至少匹配两个字。

        $scope.mySearch = function (item){
                var searchTerm = "word1"; //Need to be able to search on ["word1","word2"]
                var fields = ['firstName', 'lastName', 'email', 'phone', 'fax', 'category', 'subCat', 'company', 'street', 'zip', 'state', 'city', 'country'];

                for(var i = 0, l = fields.length; i < l; i ++){
                    if(item[fields[i]] && item[fields[i]].toLowerCase().indexOf(searchTerm)!==-1){
                        return true;
                    }
                } return false;
        };

此代码使用一个单词,在此示例中&#34; word1&#34; ...如何使其适用于单词数组?我试图添加另一个for循环时迷路了。

2 个答案:

答案 0 :(得分:1)

$scope.mySearch = function (item)
{
    var searchTerms = ["word1","word2"];
    var fields = ['firstName', 'lastName', 'email', 'phone', 'fax', 'category', 'subCat', 'company', 'street', 'zip', 'state', 'city', 'country'];

    for(var i = 0, l = searchTerm.length; i < l; i++)
    {
        if(fields.indexOf(searchTerms[i]) > -1)
        {
            return true;
        }
    }
    return false;
};

答案 1 :(得分:1)

以下实施适用于任意数量的searchTerms和任意数量的fields,并执行严格比较(===)。您可以根据需要进行修改。

所以,这是一个想法:

所有 searchTerms 匹配(即allMatch为真)iff为每个 < em>在searchTerms中有一些 字段 (在fields中),以便指定item < strong> field 属性的值等于 word 。“

$scope.mySearch = function (item) {
    var searchTerms = ['word1' 'word2'];
    var fields = ['firstName', 'lastName', 'email', 'phone', 'fax'.
                  'category', 'subCat', 'company', 'street', 'zip',
                  'state', 'city', 'country'];

    var allMatch = searchTerms.every(function (word) {
        return fields.some(function (field) {
            return item[field] === word;
        });
    });

    return allMatch;
};

<子> 它可以很容易地修改为使用for-loop,但我选择使用数组的 every() some() 方法,因为我发现更具说服力的。