在 Angular 中,如何在一个数组中搜索对象

在 Angular 中,我在 scope 内有一个对象返回很多对象。每个都有一个 ID (这是存储在一个平面文件,所以没有数据库,我似乎不能使用 ng-resource)

在我的控制器里:

$scope.fish = [
{category:'freshwater', id:'1', name: 'trout', more:'false'},
{category:'freshwater', id:'2', name:'bass', more:'false'}
];

在我看来,我有更多的信息隐藏的鱼默认与 ng-show更多,但当我单击简单的显示更多选项卡,我想调用函数 showdetails(fish.fish_id)。 我的函数是这样的:

$scope.showdetails = function(fish_id) {
var fish = $scope.fish.get({id: fish_id});
fish.more = true;
}

现在在视图中显示更多的细节。但是在搜索了文档之后,我不知道如何搜索那个 fish数组。

那么如何查询数组呢?在控制台中,如何调用调试器以便使用 $scope对象?

255539 次浏览

我知道这对你有帮助。

这是我试图为你模拟的东西。

检查 jsFiddle;)

Http://jsfiddle.net/migontech/gbw8z/5/

创建了一个过滤器,您也可以在‘ ng-repeat’中使用它

app.filter('getById', function() {
return function(input, id) {
var i=0, len=input.length;
for (; i<len; i++) {
if (+input[i].id == +id) {
return input[i];
}
}
return null;
}
});

在控制器中的用法:

app.controller('SomeController', ['$scope', '$filter', function($scope, $filter) {
$scope.fish = [{category:'freshwater', id:'1', name: 'trout', more:'false'},  {category:'freshwater', id:'2', name:'bass', more:'false'}]


$scope.showdetails = function(fish_id){
var found = $filter('getById')($scope.fish, fish_id);
console.log(found);
$scope.selected = JSON.stringify(found);
}
}]);

如果有任何问题,请告诉我。

A dirty and easy solution could look like

$scope.showdetails = function(fish_id) {
angular.forEach($scope.fish, function(fish, key) {
fish.more = fish.id == fish_id;
});
};

您可以使用现有的 $filter 服务

 $scope.showdetails = function(fish_id) {
var found = $filter('filter')($scope.fish, {id: fish_id}, true);
if (found.length) {
$scope.selected = JSON.stringify(found[0]);
} else {
$scope.selected = 'Not found';
}
}

角度文件在这里 http://docs.angularjs.org/api/ng.filter:filter

为了补充@Migontech 的回答和他的讲话,他说你可以“让它更通用”,这里有一个方法可以做到这一点。以下资料可让你按任何物业进行搜寻:

.filter('getByProperty', function() {
return function(propertyName, propertyValue, collection) {
var i=0, len=collection.length;
for (; i<len; i++) {
if (collection[i][propertyName] == +propertyValue) {
return collection[i];
}
}
return null;
}
});

然后,过滤的要求就会变成:

var found = $filter('getByProperty')('id', fish_id, $scope.fish);

注意,我删除了一元(+)运算符以允许基于字符串的匹配..。

Angularjs 已经有了过滤选项, https://docs.angularjs.org/api/ng/filter/filter

你的解决方案是正确的,但是不必要的复杂。你可以使用 pure javascript filter function。这是你的模型:

     $scope.fishes = [{category:'freshwater', id:'1', name: 'trout', more:'false'},  {category:'freshwater', id:'2', name:'bass', more:'false'}];

这就是你的功能:

     $scope.showdetails = function(fish_id){
var found = $scope.fishes.filter({id : fish_id});
return found;
};

你也可以使用表达式:

     $scope.showdetails = function(fish_id){
var found = $scope.fishes.filter(function(fish){ return fish.id === fish_id });
return found;
};

关于这个函数的更多信息: LINK

看到这个帖子,但我想搜索与我的搜索不匹配的 ID:

found = $filter('filter')($scope.fish, {id: '!fish_id'}, false);