从中获取特定对象和没有循环的数组的最佳方法

Amy*_*yth 3 javascript angularjs

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

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;    
});
Run Code Online (Sandbox Code Playgroud)

现在$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 ...},
]
Run Code Online (Sandbox Code Playgroud)

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

angular.forEach($scope.xyz, function(obj){ return obj.id == 1;});
Run Code Online (Sandbox Code Playgroud)

但有没有办法我可以做到而不循环列表?

Kay*_*Gee 8

虽然这已经在一年前得到解答,因为这是谷歌的最佳成果之一,我想我可以添加以下建议,这可能是最简单的过滤方式.将$ filter注入控制器后,

var result = $filter('filter')($scope.xyz, {id:"1"});
Run Code Online (Sandbox Code Playgroud)

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


Ber*_*rgi 5

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

  • 如果数组按id排序,则可以使用二进制搜索算法(O(log n)).
  • 如果数组索引始终对应于id-1(或类似的简单公式),则可以直接访问它O(1).

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