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

时间:2013-03-14 13:57:38

标签: 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;    
});

现在$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;});

但有没有办法可以在没有循环列表的情况下完成呢?

2 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:5)

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

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

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