has.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. var baseGet = require('../internal/baseGet'),
  2. baseSlice = require('../internal/baseSlice'),
  3. isArguments = require('../lang/isArguments'),
  4. isArray = require('../lang/isArray'),
  5. isIndex = require('../internal/isIndex'),
  6. isKey = require('../internal/isKey'),
  7. isLength = require('../internal/isLength'),
  8. last = require('../array/last'),
  9. toPath = require('../internal/toPath');
  10. /** Used for native method references. */
  11. var objectProto = Object.prototype;
  12. /** Used to check objects for own properties. */
  13. var hasOwnProperty = objectProto.hasOwnProperty;
  14. /**
  15. * Checks if `path` is a direct property.
  16. *
  17. * @static
  18. * @memberOf _
  19. * @category Object
  20. * @param {Object} object The object to query.
  21. * @param {Array|string} path The path to check.
  22. * @returns {boolean} Returns `true` if `path` is a direct property, else `false`.
  23. * @example
  24. *
  25. * var object = { 'a': { 'b': { 'c': 3 } } };
  26. *
  27. * _.has(object, 'a');
  28. * // => true
  29. *
  30. * _.has(object, 'a.b.c');
  31. * // => true
  32. *
  33. * _.has(object, ['a', 'b', 'c']);
  34. * // => true
  35. */
  36. function has(object, path) {
  37. if (object == null) {
  38. return false;
  39. }
  40. var result = hasOwnProperty.call(object, path);
  41. if (!result && !isKey(path)) {
  42. path = toPath(path);
  43. object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
  44. if (object == null) {
  45. return false;
  46. }
  47. path = last(path);
  48. result = hasOwnProperty.call(object, path);
  49. }
  50. return result || (isLength(object.length) && isIndex(path, object.length) &&
  51. (isArray(object) || isArguments(object)));
  52. }
  53. module.exports = has;