8

Is there a simple way to find an object in a list based on an attribute value, without looping on the list?

For example given a list like the following :

var lst = [
  {
    name: "foo", 
    value: "fooValue"
  }, 
  {
    name: "bar", 
    value: "barValue"
  }
];

Is there some kind of "find" method, such that lst.find("name", "foo") would return the object which has a "name" attribute with the value "foo"?

2
  • 2
    At most, the loop would be hidden from you, but still execute inside some other function. If that is acceptable you can use the filterFilter service. Commented Dec 4, 2013 at 15:22
  • I know a loop has to be done somehow, I'm just searching for a lighter syntax. Commented Dec 4, 2013 at 16:06

2 Answers 2

30

You can use the $filter service:

angular.module('app', [])

function ParentCtrl($scope, $filter){
    var lst = [{name : "foo", value : "fooValue"}, {name: "bar", value: "barValue"}, { name: 'foo', value: 'something else'}];
    var newTemp = $filter("filter")(lst, {name:'foo'});
    console.log(newTemp);
}

jsFiddle: http://jsfiddle.net/W2Z86/

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks @matthew-berg . For other noobs (like me). In case it's not immediately obvious, newTemp is an array of objects that match the filter. If you know you've got a single object that matches, you might want the first element in the array (i.e. newTemp[0] ).
6

If you want a strict comparison, you need to set the comparator (3rd argument) to true like the following (based on Mathew's answer):

var newTemp = $filter("filter")(lst, {name:'foo'}, true);

See the doc on $filter on AngularJS site: https://docs.angularjs.org/api/ng/filter/filter

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.