foop
Version:
interfaces that describe their intentions.
49 lines (43 loc) • 3.62 kB
JavaScript
var isObj = require('../is/obj')
var getPathSegments = require('./segments')
var isDottable = require('./dottable')
/**
* @name dot.has
* @memberOf dot
* @func
* @since 3.0.0
* @extends dot/getPathSegments
*
* @param {Object} obj the object to retrieve the nested property from.
* @param {Dottable | string | Array} path dot-prop-path to use
* @return {boolean} has at path
*
* {@link https://github.com/jashkenas/underscore/blob/master/underscore.js#L1369 underscore-has}
* @see {@link underscore-has}
*
* @example
*
* dot.has({a: {b: 2}}, 'a.b'); //=> true
* dot.has({a: {b: 2}}, ['a', 'b']); //=> true
* dot.has({c: {b: 2}}, ['a', 'b']); //=> undefined
*
*/
module.exports = function dotHas(obj, path) {
if (!isDottable(obj, path)) {
return false
}
var pathArr = getPathSegments(path)
for (var i = 0; i < pathArr.length; i++) {
if (isObj(obj)) {
if (!(pathArr[i] in obj)) {
return false
}
obj = obj[pathArr[i]]
}
else {
return false
}
}
return true
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzLmpzIiwic291cmNlcyI6WyJoYXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgaXNPYmogPSByZXF1aXJlKCcuLi9pcy9vYmonKVxuY29uc3QgZ2V0UGF0aFNlZ21lbnRzID0gcmVxdWlyZSgnLi9zZWdtZW50cycpXG5jb25zdCBpc0RvdHRhYmxlID0gcmVxdWlyZSgnLi9kb3R0YWJsZScpXG5cbi8qKlxuICogQG5hbWUgZG90Lmhhc1xuICogQG1lbWJlck9mIGRvdFxuICogQGZ1bmNcbiAqIEBzaW5jZSAzLjAuMFxuICogQGV4dGVuZHMgZG90L2dldFBhdGhTZWdtZW50c1xuICpcbiAqIEBwYXJhbSAge09iamVjdH0gb2JqIHRoZSBvYmplY3QgdG8gcmV0cmlldmUgdGhlIG5lc3RlZCBwcm9wZXJ0eSBmcm9tLlxuICogQHBhcmFtICB7RG90dGFibGUgfCBzdHJpbmcgfCBBcnJheX0gcGF0aCBkb3QtcHJvcC1wYXRoIHRvIHVzZVxuICogQHJldHVybiB7Ym9vbGVhbn0gaGFzIGF0IHBhdGhcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL2Jsb2IvbWFzdGVyL3VuZGVyc2NvcmUuanMjTDEzNjkgdW5kZXJzY29yZS1oYXN9XG4gKiBAc2VlIHtAbGluayB1bmRlcnNjb3JlLWhhc31cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgIGRvdC5oYXMoe2E6IHtiOiAyfX0sICdhLmInKTsgLy89PiB0cnVlXG4gKiAgICBkb3QuaGFzKHthOiB7YjogMn19LCBbJ2EnLCAnYiddKTsgLy89PiB0cnVlXG4gKiAgICBkb3QuaGFzKHtjOiB7YjogMn19LCBbJ2EnLCAnYiddKTsgLy89PiB1bmRlZmluZWRcbiAqXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZG90SGFzKG9iaiwgcGF0aCkge1xuICBpZiAoIWlzRG90dGFibGUob2JqLCBwYXRoKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3QgcGF0aEFyciA9IGdldFBhdGhTZWdtZW50cyhwYXRoKVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aEFyci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChpc09iaihvYmopKSB7XG4gICAgICBpZiAoIShwYXRoQXJyW2ldIGluIG9iaikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIG9iaiA9IG9ialtwYXRoQXJyW2ldXVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iXSwibmFtZXMiOlsiY29uc3QiLCJsZXQiXSwibWFwcGluZ3MiOiJBQUFBQSxHQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7QUFDbENBLEdBQUssQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUM3Q0EsR0FBSyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCeEMsTUFBTSxDQUFDLE9BQU8sR0FBRyxTQUFTLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFO0VBQzFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFO0lBQzFCLE9BQU8sS0FBSztHQUNiOztFQUVEQSxHQUFLLENBQUMsT0FBTyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUM7O0VBRXJDLEtBQUtDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQ3ZDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO01BQ2QsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFO1FBQ3hCLE9BQU8sS0FBSztPQUNiOztNQUVELEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3RCO1NBQ0k7TUFDSCxPQUFPLEtBQUs7S0FDYjtHQUNGOztFQUVELE9BQU8sSUFBSTtDQUNaOyJ9