3

在我的角度应用程序的一个控制器中,我有一个变量集如下。

SomeService.get({}, function(data){
    // this sets xyz as the list of the data retrieved 
    // from the resource within the controllers scope
    $scope.xyz = data.objects;    
});

现在$scope.xyz看起来像

[
    0: {id: 1, ...more data here ...},
    1: {id: 2, ...more data here ...},
    2: {id: 3, ...more data here ...},
    3: {id: 4, ...more data here ...},
    4: {id: 5, ...more data here ...},
    5: {id: 6, ...more data here ...},
]

我想要做的是使用id属性(而不是列表索引)在 xyz 中获取一个对象。我知道我可以按如下方式迭代数组。

angular.forEach($scope.xyz, function(obj){ return obj.id == 1;});

但是有没有办法在不循环列表的情况下做到这一点?

4

2 回答 2

8

虽然这已经在一年前得到了回答,但由于这是谷歌的顶级结果之一,我想我可以添加以下建议,这可能是最简单的过滤方法。将 $filter 注入控制器后,

var result = $filter('filter')($scope.xyz, {id:"1"});

参考: https ://docs.angularjs.org/api/ng/filter/filter

于 2014-10-15T20:57:48.093 回答
5

O(n)不,除非满足某些先决条件,否则您无法真正避免循环 ( )。

  • 如果数组按 id 排序,则可以使用二分查找算法 ( O(log n))。
  • 如果数组索引总是对应 id-1(或者一些类似的简单公式),可以直接在O(1).

如果最初没有满足这些条件,但是您需要通过 id 多次访问项目,那么将它们带入该形式(排序/构建哈希映射)可能会有所帮助。

于 2013-03-14T14:10:36.600 回答