文本搜索 - 过滤两个不同对象/数组中的两个单词

时间:2014-07-06 07:10:43

标签: javascript angularjs

我使用angularJS作为我的webapp,我遇到了以下问题。当我使用angularjs' filter进行搜索时,让我们说" John Smith",我的对象,按照以下方式构建({firstname:' John',lastname :' Smith'}),因为名字和姓氏不属于同一个密钥而无法识别。

知道如何将空间变成空格或搜索其他键(或数组)吗?

2 个答案:

答案 0 :(得分:1)

修改

根据您的要求,我想出了这个:

$scope.compFunc = function(actual, expected) {

    var expectedSplit = expected.split(' ');
    var fullActual;
    //Search people for the person the name belongs to
    $scope.names.forEach(function(person){
        angular.forEach(person, function(name){
            if (name === actual) {
                fullActual = person;
            }
        })

    })

    //create an array from the names object for comparison
    var fullActualArray = [];
    angular.forEach(fullActual, function(name, key){
        if (key != '$$hashKey')
            fullActualArray.push(name = name.toLowerCase());  
    })

    fullActualArray.sort();
    expectedSplit.sort();

    return actual.toLowerCase().indexOf(expected.toLowerCase()) > -1|| 
           fullActualArray.join(',') === expectedSplit.join(',');


};

这应该与您的期望相符。

FIDDLE

注意:为了清楚起见,我使用了forEach,但是如果您有大量数据,则可能需要将其更改为for个循环,这些循环速度提高了90%,并且在找到匹配。


以前的解决方案:

这很简单,检查搜索中输入的值(expected)是否存在于名字或姓氏(actual)中,或相反。所以进入“Robert Downy”应该有效,但“Robert blargh”或“abcDownyefg”也是如此。检查整个事物(名字+姓氏)是你必须在比较功能之外做的事情,并且据我所知,不支持开箱即用的角度。

我还使用以下内容创建了一个新数组,以便使用全名进行比较:

$scope.fullnames = $scope.names.map(function(name){
    return {
        firstname: name.firstname,
        lastname: name.lastname,
        fullname :name.firstname + " " + name.lastname
    } 
})

虽然扩展原始数组可以这样做:

$scope.names.forEach(function(name){
     angular.extend(name,{fullname:name.firstname + " " + name.lastname});
})

这很简单有效,也是我会做的。

答案 1 :(得分:0)

您可以创建自己的custom filter,并随意搜索。