La meilleure façon d'obtenir un objet spécifique et le tableau sans boucle

Dans l'un des contrôleurs de mon application angulaire, j'ai un ensemble de variables comme suit.

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; }); 

Maintenant, $scope.xyz ressemble à quelque chose

 [ 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 ...}, ] 

Ce que j'essaie de faire, c'est obtenir un objet dans xyz à l'aide de la propriété id (pas l'index de la liste). Je suis conscient que je peux itérer sur le tableau comme suit.

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

Mais y at-il une façon de le faire sans boucler la liste?

Non, vous ne pouvez pas vraiment éviter de boucler ( O(n) ) à moins qu'il n'y ait certaines conditions préalables.

  • Si le tableau est trié par ID, vous pouvez utiliser un algorithme de recherche binaire ( O(log n) ).
  • Si l'indice du tableau correspond toujours à l'id-1 (ou à une formule simple similaire), vous pouvez l'accéder directement en O(1) .

Si ces conditions ne sont pas remplies initialement, mais vous devez accéder aux éléments par identifiant à plusieurs reprises, il pourrait être utile de les mettre dans cette forme (tri / création d'une carte de hash).

Bien que cela soit déjà répondu il y a un an, puisqu'il s'agit de l'un des meilleurs résultats de Google, j'ai pensé pouvoir ajouter la suggestion suivante, qui peut être le moyen le plus simple de filtrer. Après avoir injecté $ filter dans votre contrôleur,

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

Référence: https://docs.angularjs.org/api/ng/filter/filter