简体   繁体   English

如何在AngularJS中按对象中的特定属性过滤?

[英]How to filter by an specific attribute in an object in AngularJS?

I have object in AngularJS: 我在AngularJS中有对象:

 genres = [{
    label: "Trance",
    genre: "8",
    position: 8
}, {
    label: "House",  
    genre: "2",
    position: 8
}]

How to filter this array by genre by ng-click ? 如何通过ng-clickgenre过滤此数组? For example ng-click="filterByGenre(2)" . 例如ng-click="filterByGenre(2)"

It should returns me only one element: 它应该只返回一个元素:

{
    label: "House",  
    genre: "2",
    position: 8
}

Here is a simple working Fiddle of what your try to achieve. 这是您尝试实现的简单工作提琴 It does filter your object by attribute genre where you can search for the Id in the text field. 它确实按属性genre过滤对象,您可以在其中搜索文本字段中的Id For example 8 . 例如8

Take a look at the filter declaration filter:{genre:searchGenre} which holds the attribute name genre to filter and the model input searchGenre . 看一下过滤器声明filter:{genre:searchGenre} ,其中包含要过滤的属性名称genre和模型输入searchGenre For more information please take a look at the AngularJS Documentation of filter . 有关更多信息,请查看filterAngularJS文档


The following example shows how to filter in View - Fiddle demo 以下示例显示了如何在“视图- 小提琴”演示中进行过滤

View 视图

<div ng-controller="MyCtrl">
    <h1>Filter items</h1>
    <input type="text" ng-model="searchGenre">
    <h2>Genres</h2>
    <div ng-repeat="genre in genres | filter:{genre:searchGenre}">
      {{genre.label}}
    </div>
</div>

AngularJS app AngularJS应用

var myApp = angular.module('myApp',[]);

function MyCtrl($scope) {
   $scope.genres = [{
      label: "Trance",
      genre: "8",
      position: 8
  }, {
      label: "House",  
      genre: "2",
      position: 8
  }];
}

The following example shows how to filter in an controller - Fiddle demo 以下示例显示了如何在控制器中进行过滤-Fiddle演示

View 视图

<div ng-controller="MyCtrl">
    <div>Filter items</div>
    <input type="text" ng-model="searchGenre">
    <div>Genres</div>
    <div ng-repeat="genre in filtered">
      {{genre.label}}
    </div>
</div>

AngularJS App AngularJS应用

var myApp = angular.module('myApp',[]);

function MyCtrl($scope, filterFilter) {

   $scope.genres = [{
      label: "Trance",
      genre: "8",
      position: 8
  }, {
      label: "House",  
      genre: "2",
      position: 8
  }];

  //init search phrase
  $scope.searchGenre = '';

  //init filtered scope
  $scope.filtered = [];

  /**
   * Watch keyword change
   */
  $scope.$watch('searchGenre', function(term) {
    $scope.filtered = filterFilter($scope.genres, {'genre': term});
  });
}

Try like this. 尝试这样。

 var app = angular.module('app', []); app.controller('myController', function($scope){ $scope.genres = [ { label: "Trance", genre: "8", position: 8 }, { label: "House", genre: "2", position: 8 } ]; $scope.setGenreFilter = function(genre){ $scope.genreFilter = genre; } }) 
 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <div ng-app="app" ng-controller="myController"> <div>Filter items</div> <span ng-repeat="genre in genres" ng-click="setGenreFilter(genre.genre)">{{genre.genre}}, </span> <div>****************GENRE**********************</div> <div ng-repeat="item in genres | filter:{genre:genreFilter}"> {{item.label}} </div> </div> 

You can use filter function 您可以使用过滤器功能

 genres.filter(function(item){ return item.genre == '2'; }); 

or you can do it the old for loop way 或者你可以用旧的for循环方式

 var filteredData = []; for(var i=0;i<genres.length;i++){ if(genres[i].genre == '2'){ filteredData.push(genres[i]); } } 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM