foop
Version:
interfaces that describe their intentions.
73 lines (64 loc) • 6.32 kB
JavaScript
var isNullOrUndefined = require('../is/nullOrUndefined')
var isEnumerable = require('../is/enumerable')
var isUndefined = require('../is/undefined')
var lengthMinusOne = require('../util/lengthMinusOne')
var getPathSegments = require('./segments')
var isDottable = require('./dottable')
/**
* @desc dot-prop get at path
* @namespace dot
* @memberOf dot
* @since 3.0.0
*
* @alias dotGet
* @alias get
*
* @param {Object} obj the object to retrieve the nested property from.
* @param {Dottable | string | Array} path dot-prop-path to use
* @param {*} fallback use when there is no value at specified path
* @return {*} value at path or fallback
*
* @func
* @extends dot/getPathSegments
*
* {@link https://github.com/jashkenas/underscore/blob/master/underscore.js#L150 underscore-deep-get}
* @see {@link underscore-deep-get}
*
* @example
*
* dot.get({a: {b: 2}}, 'a.b') //=> 2
* dot.get({a: {b: 2}}, ['a', 'b']) //=> 2
* dot.get({c: {b: 2}}, ['a', 'b']) //=> undefined
*
*/
module.exports = function(obj, path, fallback) {
// if (pathArray.length === 1 && hasOwnProperty(dot, path[0]))
// return dot[path[0]]
// else if (isString(path) && path.includes('.') === false && hasOwnProperty(dot, path))
// return dot[path]
if (!isDottable(obj, path)) {
return isUndefined(fallback) ? obj : fallback
}
var pathArr = getPathSegments(path)
for (var i = 0; i < pathArr.length; i++) {
if (!isEnumerable(obj, pathArr[i])) {
return fallback
}
obj = obj[pathArr[i]]
if (isNullOrUndefined(obj)) {
/*
* `obj` is either `undefined` or `null` so we want to stop the loop, and
* if this is not the last bit of the path, and
* if it did't return `undefined`
* it would return `null` if `obj` is `null`
* but we want `get({foo: null}, 'foo.bar')` to equal `undefined`, or the supplied fallback, not `null`
*/
if (i !== lengthMinusOne(pathArr)) {
return fallback
}
break
}
}
return obj
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LmpzIiwic291cmNlcyI6WyJnZXQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgaXNOdWxsT3JVbmRlZmluZWQgPSByZXF1aXJlKCcuLi9pcy9udWxsT3JVbmRlZmluZWQnKVxuY29uc3QgaXNFbnVtZXJhYmxlID0gcmVxdWlyZSgnLi4vaXMvZW51bWVyYWJsZScpXG5jb25zdCBpc1VuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL2lzL3VuZGVmaW5lZCcpXG5jb25zdCBsZW5ndGhNaW51c09uZSA9IHJlcXVpcmUoJy4uL3V0aWwvbGVuZ3RoTWludXNPbmUnKVxuY29uc3QgZ2V0UGF0aFNlZ21lbnRzID0gcmVxdWlyZSgnLi9zZWdtZW50cycpXG5jb25zdCBpc0RvdHRhYmxlID0gcmVxdWlyZSgnLi9kb3R0YWJsZScpXG5cbi8qKlxuICogQGRlc2MgZG90LXByb3AgZ2V0IGF0IHBhdGhcbiAqIEBuYW1lc3BhY2UgZG90XG4gKiBAbWVtYmVyT2YgZG90XG4gKiBAc2luY2UgMy4wLjBcbiAqXG4gKiBAYWxpYXMgZG90R2V0XG4gKiBAYWxpYXMgZ2V0XG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBvYmogdGhlIG9iamVjdCB0byByZXRyaWV2ZSB0aGUgbmVzdGVkIHByb3BlcnR5IGZyb20uXG4gKiBAcGFyYW0gIHtEb3R0YWJsZSB8IHN0cmluZyB8IEFycmF5fSBwYXRoIGRvdC1wcm9wLXBhdGggdG8gdXNlXG4gKiBAcGFyYW0gIHsqfSBmYWxsYmFjayB1c2Ugd2hlbiB0aGVyZSBpcyBubyB2YWx1ZSBhdCBzcGVjaWZpZWQgcGF0aFxuICogQHJldHVybiB7Kn0gdmFsdWUgYXQgcGF0aCBvciBmYWxsYmFja1xuICpcbiAqIEBmdW5jXG4gKiBAZXh0ZW5kcyBkb3QvZ2V0UGF0aFNlZ21lbnRzXG4gKlxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNoa2VuYXMvdW5kZXJzY29yZS9ibG9iL21hc3Rlci91bmRlcnNjb3JlLmpzI0wxNTAgdW5kZXJzY29yZS1kZWVwLWdldH1cbiAqIEBzZWUge0BsaW5rIHVuZGVyc2NvcmUtZGVlcC1nZXR9XG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICBkb3QuZ2V0KHthOiB7YjogMn19LCAnYS5iJykgICAgICAvLz0+IDJcbiAqICAgIGRvdC5nZXQoe2E6IHtiOiAyfX0sIFsnYScsICdiJ10pIC8vPT4gMlxuICogICAgZG90LmdldCh7Yzoge2I6IDJ9fSwgWydhJywgJ2InXSkgLy89PiB1bmRlZmluZWRcbiAqXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqLCBwYXRoLCBmYWxsYmFjaykge1xuICAvLyBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMSAmJiBoYXNPd25Qcm9wZXJ0eShkb3QsIHBhdGhbMF0pKVxuICAvLyAgIHJldHVybiBkb3RbcGF0aFswXV1cbiAgLy8gZWxzZSBpZiAoaXNTdHJpbmcocGF0aCkgJiYgcGF0aC5pbmNsdWRlcygnLicpID09PSBmYWxzZSAmJiBoYXNPd25Qcm9wZXJ0eShkb3QsIHBhdGgpKVxuICAvLyAgIHJldHVybiBkb3RbcGF0aF1cblxuICBpZiAoIWlzRG90dGFibGUob2JqLCBwYXRoKSkge1xuICAgIHJldHVybiBpc1VuZGVmaW5lZChmYWxsYmFjaykgPyBvYmogOiBmYWxsYmFja1xuICB9XG5cbiAgY29uc3QgcGF0aEFyciA9IGdldFBhdGhTZWdtZW50cyhwYXRoKVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aEFyci5sZW5ndGg7IGkrKykge1xuICAgIGlmICghaXNFbnVtZXJhYmxlKG9iaiwgcGF0aEFycltpXSkpIHtcbiAgICAgIHJldHVybiBmYWxsYmFja1xuICAgIH1cblxuICAgIG9iaiA9IG9ialtwYXRoQXJyW2ldXVxuXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKG9iaikpIHtcbiAgICAgIC8qXG4gICAgICAgKiBgb2JqYCBpcyBlaXRoZXIgYHVuZGVmaW5lZGAgb3IgYG51bGxgIHNvIHdlIHdhbnQgdG8gc3RvcCB0aGUgbG9vcCwgYW5kXG4gICAgICAgKiBpZiB0aGlzIGlzIG5vdCB0aGUgbGFzdCBiaXQgb2YgdGhlIHBhdGgsIGFuZFxuICAgICAgICogaWYgaXQgZGlkJ3QgcmV0dXJuIGB1bmRlZmluZWRgXG4gICAgICAgKiBpdCB3b3VsZCByZXR1cm4gYG51bGxgIGlmIGBvYmpgIGlzIGBudWxsYFxuICAgICAgICogYnV0IHdlIHdhbnQgYGdldCh7Zm9vOiBudWxsfSwgJ2Zvby5iYXInKWAgdG8gZXF1YWwgYHVuZGVmaW5lZGAsIG9yIHRoZSBzdXBwbGllZCBmYWxsYmFjaywgbm90IGBudWxsYFxuICAgICAgICovXG4gICAgICBpZiAoaSAhPT0gbGVuZ3RoTWludXNPbmUocGF0aEFycikpIHtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrXG4gICAgICB9XG5cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9ialxufVxuIl0sIm5hbWVzIjpbImNvbnN0IiwibGV0Il0sIm1hcHBpbmdzIjoiQUFBQUEsR0FBSyxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQztBQUMxREEsR0FBSyxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUM7QUFDaERBLEdBQUssQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDO0FBQzlDQSxHQUFLLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQztBQUN4REEsR0FBSyxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO0FBQzdDQSxHQUFLLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkJ4QyxNQUFNLENBQUMsT0FBTyxHQUFHLFNBQVMsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7Ozs7OztFQU03QyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRTtJQUMxQixPQUFPLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLEdBQUcsUUFBUTtHQUM5Qzs7RUFFREEsR0FBSyxDQUFDLE9BQU8sR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDOztFQUVyQyxLQUFLQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtJQUN2QyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtNQUNsQyxPQUFPLFFBQVE7S0FDaEI7O0lBRUQsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7O0lBRXJCLElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUU7Ozs7Ozs7O01BUTFCLElBQUksQ0FBQyxLQUFLLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNqQyxPQUFPLFFBQVE7T0FDaEI7O01BRUQsS0FBSztLQUNOO0dBQ0Y7O0VBRUQsT0FBTyxHQUFHO0NBQ1g7In0=