当前位置: 首页 > 面试题库 >

在对象映射而非AngularJS中的数组上进行过滤

谢墨竹
2023-03-14
问题内容

给定一个具有$ scope属性的控制器,该控制器是具有其他属性的对象,而不是如下所示的数组,我该如何过滤该ng-repeat集合?

这是一个JSFiddle:http :
//jsfiddle.net/ZfGx4/110/

控制器:

function HelloCntl($scope, $filter) {
    $scope.friends = {
        john: {
            name: 'John',
            phone: '555-1276'
        },
        mary: {
            name: 'Mary',
            phone: '800-BIG-MARY'
        },
        mike: {
            name: 'Mike',
            phone: '555-4321'
        },
        adam: {
            name: 'Adam',
            phone: '555-5678'
        },
        julie: {
            name: 'Julie',
            phone: '555-8765'
        }
    };
}​

模板:

<div ng:app>
 <div ng-controller="HelloCntl">
  <input placeholder="Type to filter" ng-model="query">     
  <ul>
   <li ng-repeat="(id, friend) in friends | filter:query">
    <span>{{friend.name}} @ {{friend.phone}}</span>
   </li>
  </ul>
 </div>
</div>

问题答案:

我将数据结构更改为数组。无论如何,这是另一个过滤好友对象的实现。

angular.module('filters',['utils'])
  .filter('friendFilter', function(utils){

    return function(input, query){
      if(!query) return input;
      var result = [];

      angular.forEach(input, function(friend){
        if(utils.compareStr(friend.name, query) ||
           utils.compareStr(friend.phone, query))
          result.push(friend);          
      });
      return result;
    };
  });

这样仅对对象进行一次迭代,然后按name和比较phone,就可以这样调用。

<li ng-repeat="friend in friends | friendFilter:query">

compareStr在另一个模块中定义了,但您实际上并不需要这样做。

angular.module('utils', [])
  .factory('utils', function(){
    return{
      compareStr: function(stra, strb){
        stra = ("" + stra).toLowerCase();
        strb = ("" + strb).toLowerCase();
        return stra.indexOf(strb) !== -1;
      }
    };
  });

不要忘记将filters模块注入您的应用程序

angular.module('app',['filters'])

这是完整的示例:http :
//jsbin.com/acagag/5/edit



 类似资料:
  • 问题内容: 我有一个对象: 我正在寻找一种本机方法,该方法类似于以下方法: JavaScript是否对对象具有这样的功能?(我想为Node.JS使用它,所以我不在乎跨浏览器的问题。) 问题答案: 该对象没有本地对象,但是如何处理: 但是您可以使用以下命令轻松地遍历对象: 更新资料 很多人提到,以前的方法不会返回新对象,而是对对象本身进行操作。为此,我想添加另一个解决方案,该解决方案返回一个新对象并

  • 我试图通过嵌套的数组使用JSX映射代码。 这是: 以及迄今为止我提出的代码: 这就是我得到的错误: 我做错了什么?

  • 我正在尝试将我的对象[]数组映射并过滤到int[]数组。如果对象是int,效果很好,但如果不是int,则抛出强制转换异常。我想知道我是否可以在lambda表达式中附加一个try/catch?这是我的代码: 或者更好的方法是试着抓住整个街区?

  • 问题内容: 我试图映射对象数组,每个数组包含另一个嵌套的对象数组。但是,该映射不适用于嵌套数组。我如何在嵌套数组的内容上进行映射,同时使所有的父对象保持相同? 小提琴: https : //jsfiddle.net/69z2wepo/249197/ 数据结构如下: 地图看起来像 问题答案: 由于每个元素都有一个数组,因此您也必须结束。 例

  • 使用一个函数将数组的值映射到对象,其键值对中,原始值作为键,映射值作为值。 使用一个匿名的内部函数作用域来声明一个 undefined 的内存空间,使用闭包来存储返回值。 使用一个新的 Array 来存储带有函数映射的数组和一个逗号运算符来返回第二个步骤,而不需要从一个上下文移动到另一个上下文(由于闭包和操作顺序)。 const mapObject = (arr, fn) => (a => (