// save a reference to the core implementation var indexOfValue = _.indexOf; // using .mixin allows both wrapped and unwrapped calls: // _(array).indexOf(...) and _.indexOf(array, ...) _.mixin({ // return the index of the first array element passing a test indexOf: function(array, test) { // delegate to standard indexOf if the test isn't a function if (!_.isFunction(test)) return indexOfValue(array, test); // otherwise, look for the index for (var x = 0; x < array.length; x++) { if (test(array[x])) return x; } // not found, return fail value return -1; } }); _.indexOf([1,2,3], 3); // 2 _.indexOf([1,2,3], function(el) { return el > 2; } ); // 2