【问题标题】:Text search - filter two words in two different objects/arrays文本搜索 - 过滤两个不同对象/数组中的两个词
【发布时间】:2014-08-26 22:16:30
【问题描述】:

我正在为我的 web 应用程序使用 angularJS,但我遇到了以下问题。当我使用angularjs' filter 搜索时,比如说“John Smith”,我的对象({firstname: 'John', lastname: 'Smith'})将无法识别,因为名字和姓氏不是同一个键的一部分。

知道如何使空间成为空格或在其他键(或数组)中搜索吗?

【问题讨论】:

  • 最快的方法是为每个对象添加一个fullname
  • 这不是一个好的答案,我给你举了一个例子,但我的对象就是这样!

标签: javascript angularjs


【解决方案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});
})

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

【讨论】:

  • 感谢 Mosho,它对我帮助很大,但我仍在寻找更通用的解决方案。假设我的对象不一致,并且从一个对象到另一个对象可以有不同的键或数组......虽然我找到了一个解决方案,但它不是很有效。我的解决方案是拆分搜索并使用尽可能多的 angular 过滤器 ($filter('filter')),因为我在搜索中写字。然后我可以比较我的结果。问题是它对于长文本搜索效率不高......有什么建议吗?
  • 我坚持使用 angular 的过滤器,因为它有一个完整的递归搜索......如果你有其他方法,我会很高兴听到。
  • Itried 你小提琴,但如果你写 robert downy,你就不会明白!
【解决方案2】:

您可以创建自己的custom filter,并让它搜索您想要的任何内容。

【讨论】:

  • 有没有办法不重新发明轮子?可以修改现有的吗?如果是,你建议怎么做?
  • 这不是重新发明任何东西。这就是 AngularJS 的美妙之处。看看这个例子jsfiddle.net/cKN8L
猜你喜欢
  • 2019-11-14
  • 2017-04-16
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多