function find(collection, predicate, thisArg) {
	      if (isArray(collection)) {
	        var index = findIndex(collection, predicate, thisArg);
	        return index > -1 ? collection[index] : undefined;
	      }
	      predicate = getCallback(predicate, thisArg, 3);
	      return baseFind(collection, predicate, baseEach);
	    }
Iterates over elements of `collection`, returning the first element
`predicate` returns truthy for. The predicate is bound to `thisArg` and
invoked with three arguments; (value, index|key, collection).

If a property name is provided for `predicate` the created "_.property"
style callback returns the property value of the given element.

If an object is provided for `predicate` the created "_.matches" style
callback returns `true` for elements that have the properties of the given
object, else `false`.

@static
@memberOf _
@alias detect
@category Collection
@param {Array|Object|string} collection The collection to search.
@param {Function|Object|string} [predicate=_.identity] The function invoked
 per iteration. If a property name or object is provided it is used to
 create a "_.property" or "_.matches" style callback respectively.
@param {*} [thisArg] The `this` binding of `predicate`.
@returns {*} Returns the matched element, else `undefined`.
@example

var users = [
  { 'user': 'barney',  'age': 36, 'active': false },
  { 'user': 'fred',    'age': 40, 'active': true },
  { 'user': 'pebbles', 'age': 1,  'active': false }
];

_.result(_.find(users, function(chr) { return chr.age < 40; }), 'user');
// => 'barney'

// using the "_.matches" callback shorthand
_.result(_.find(users, { 'age': 1 }), 'user');
// => 'pebbles'

// using the "_.property" callback shorthand
_.result(_.find(users, 'active'), 'user');
// => 'fred'