_createIndexFinder.js 1.0 KB

123456789101112131415161718192021222324252627282930
  1. define(['./_getLength', './_setup', './isNaN'], function (_getLength, _setup, _isNaN) {
  2. // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
  3. function createIndexFinder(dir, predicateFind, sortedIndex) {
  4. return function(array, item, idx) {
  5. var i = 0, length = _getLength(array);
  6. if (typeof idx == 'number') {
  7. if (dir > 0) {
  8. i = idx >= 0 ? idx : Math.max(idx + length, i);
  9. } else {
  10. length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
  11. }
  12. } else if (sortedIndex && idx && length) {
  13. idx = sortedIndex(array, item);
  14. return array[idx] === item ? idx : -1;
  15. }
  16. if (item !== item) {
  17. idx = predicateFind(_setup.slice.call(array, i, length), _isNaN);
  18. return idx >= 0 ? idx + i : -1;
  19. }
  20. for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
  21. if (array[idx] === item) return idx;
  22. }
  23. return -1;
  24. };
  25. }
  26. return createIndexFinder;
  27. });