chain-able
Version:
interfaces that describe their intentions.
39 lines (31 loc) • 3.96 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')
module.exports = function(obj, path, value) {
if (!isDottable(obj, path)) {
return isUndefined(value) ? obj : value
}
var pathArr = getPathSegments(path)
for (var i = 0; i < pathArr.length; i++) {
if (!isEnumerable(obj, pathArr[i])) {
return value
}
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 value, not `null`
if (i !== lengthMinusOne(pathArr)) {
return value
}
break
}
}
return obj
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LmpzIiwic291cmNlcyI6WyJnZXQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgaXNOdWxsT3JVbmRlZmluZWQgPSByZXF1aXJlKCcuLi9pcy9udWxsT3JVbmRlZmluZWQnKVxuY29uc3QgaXNFbnVtZXJhYmxlID0gcmVxdWlyZSgnLi4vaXMvZW51bWVyYWJsZScpXG5jb25zdCBpc1VuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL2lzL3VuZGVmaW5lZCcpXG5jb25zdCBsZW5ndGhNaW51c09uZSA9IHJlcXVpcmUoJy4uL3V0aWwvbGVuZ3RoTWludXNPbmUnKVxuY29uc3QgZ2V0UGF0aFNlZ21lbnRzID0gcmVxdWlyZSgnLi9zZWdtZW50cycpXG5jb25zdCBpc0RvdHRhYmxlID0gcmVxdWlyZSgnLi9kb3R0YWJsZScpXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqLCBwYXRoLCB2YWx1ZSkge1xuICBpZiAoIWlzRG90dGFibGUob2JqLCBwYXRoKSkge1xuICAgIHJldHVybiBpc1VuZGVmaW5lZCh2YWx1ZSkgPyBvYmogOiB2YWx1ZVxuICB9XG5cbiAgY29uc3QgcGF0aEFyciA9IGdldFBhdGhTZWdtZW50cyhwYXRoKVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aEFyci5sZW5ndGg7IGkrKykge1xuICAgIGlmICghaXNFbnVtZXJhYmxlKG9iaiwgcGF0aEFycltpXSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIG9iaiA9IG9ialtwYXRoQXJyW2ldXVxuXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKG9iaikpIHtcbiAgICAgIC8vIGBvYmpgIGlzIGVpdGhlciBgdW5kZWZpbmVkYCBvciBgbnVsbGAgc28gd2Ugd2FudCB0byBzdG9wIHRoZSBsb29wLCBhbmRcbiAgICAgIC8vIGlmIHRoaXMgaXMgbm90IHRoZSBsYXN0IGJpdCBvZiB0aGUgcGF0aCwgYW5kXG4gICAgICAvLyBpZiBpdCBkaWQndCByZXR1cm4gYHVuZGVmaW5lZGBcbiAgICAgIC8vIGl0IHdvdWxkIHJldHVybiBgbnVsbGAgaWYgYG9iamAgaXMgYG51bGxgXG4gICAgICAvLyBidXQgd2Ugd2FudCBgZ2V0KHtmb286IG51bGx9LCAnZm9vLmJhcicpYCB0byBlcXVhbCBgdW5kZWZpbmVkYCwgb3IgdGhlIHN1cHBsaWVkIHZhbHVlLCBub3QgYG51bGxgXG4gICAgICBpZiAoaSAhPT0gbGVuZ3RoTWludXNPbmUocGF0aEFycikpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICB9XG5cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9ialxufVxuIl0sIm5hbWVzIjpbImNvbnN0IiwibGV0Il0sIm1hcHBpbmdzIjoiQUFBQUEsR0FBSyxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQztBQUMxREEsR0FBSyxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUM7QUFDaERBLEdBQUssQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDO0FBQzlDQSxHQUFLLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQztBQUN4REEsR0FBSyxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO0FBQzdDQSxHQUFLLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7O0FBRXhDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsU0FBUyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtFQUMxQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRTtJQUMxQixPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsS0FBSztHQUN4Qzs7RUFFREEsR0FBSyxDQUFDLE9BQU8sR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDOztFQUVyQyxLQUFLQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtJQUN2QyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtNQUNsQyxPQUFPLEtBQUs7S0FDYjs7SUFFRCxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzs7SUFFckIsSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsRUFBRTs7Ozs7O01BTTFCLElBQUksQ0FBQyxLQUFLLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNqQyxPQUFPLEtBQUs7T0FDYjs7TUFFRCxLQUFLO0tBQ047R0FDRjs7RUFFRCxPQUFPLEdBQUc7Q0FDWDsifQ==