2014-05-03 59 views
0

我对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; 
     }; 

此代码适用于一个单词,在本例中为“word1”...如何让它适用于单词数组?试图添加另一个循环时我迷路了。下面

回答

1

实施适用于任何数目的searchTerms和任何数量的fields并进行严格比较(===)。你可以根据你的需要修改它。

所以,这里的理念是:

所有searchTerms匹配(即allMatch为true)当且仅当每一个searchTerms有一些(以fields)使得指定的item字段属性的值等于。“

$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 S,但我选择使用Array的every()some()方法,因为我发现了更多的声明。

+0

感谢这个工程,但它失去了找不完整的单词的能力。例如,如果我只输入“wor”,它就不会返回所有包含“word”的条目。在这种情况下,我必须完成输入完整的单词才能工作。 –

+0

正如我上面提到的那样,您可以根据自己的需求对其进行自定义。对于子字符串匹配,可以将'return item [field] === word;'更改为'return item [field] .indexOf(word)> -1;'。 – gkalpak

+0

谢谢,我非常喜欢你的解决方案...甚至没有想到它可能没有循环。我想我明白你的代码应该做什么,除了indexOf不能在item [field]上调用?! –

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; 
};