You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
2.2 KiB
62 lines
2.2 KiB
4 years ago
|
import { RX_ARRAY_NOTATION } from '../constants/regex';
|
||
|
import identity from './identity';
|
||
|
import { isArray, isNull, isObject, isUndefinedOrNull } from './inspect';
|
||
|
/**
|
||
|
* Get property defined by dot/array notation in string, returns undefined if not found
|
||
|
*
|
||
|
* @link https://gist.github.com/jeneg/9767afdcca45601ea44930ea03e0febf#gistcomment-1935901
|
||
|
*
|
||
|
* @param {Object} obj
|
||
|
* @param {string|Array} path
|
||
|
* @return {*}
|
||
|
*/
|
||
|
|
||
|
export var getRaw = function getRaw(obj, path) {
|
||
|
var defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
|
||
|
// Handle array of path values
|
||
|
path = isArray(path) ? path.join('.') : path; // If no path or no object passed
|
||
|
|
||
|
if (!path || !isObject(obj)) {
|
||
|
return defaultValue;
|
||
|
} // Handle edge case where user has dot(s) in top-level item field key
|
||
|
// See https://github.com/bootstrap-vue/bootstrap-vue/issues/2762
|
||
|
// Switched to `in` operator vs `hasOwnProperty` to handle obj.prototype getters
|
||
|
// https://github.com/bootstrap-vue/bootstrap-vue/issues/3463
|
||
|
|
||
|
|
||
|
if (path in obj) {
|
||
|
return obj[path];
|
||
|
} // Handle string array notation (numeric indices only)
|
||
|
|
||
|
|
||
|
path = String(path).replace(RX_ARRAY_NOTATION, '.$1');
|
||
|
var steps = path.split('.').filter(identity); // Handle case where someone passes a string of only dots
|
||
|
|
||
|
if (steps.length === 0) {
|
||
|
return defaultValue;
|
||
|
} // Traverse path in object to find result
|
||
|
// Switched to `in` operator vs `hasOwnProperty` to handle obj.prototype getters
|
||
|
// https://github.com/bootstrap-vue/bootstrap-vue/issues/3463
|
||
|
|
||
|
|
||
|
return steps.every(function (step) {
|
||
|
return isObject(obj) && step in obj && !isUndefinedOrNull(obj = obj[step]);
|
||
|
}) ? obj : isNull(obj) ? null : defaultValue;
|
||
|
};
|
||
|
/**
|
||
|
* Get property defined by dot/array notation in string.
|
||
|
*
|
||
|
* @link https://gist.github.com/jeneg/9767afdcca45601ea44930ea03e0febf#gistcomment-1935901
|
||
|
*
|
||
|
* @param {Object} obj
|
||
|
* @param {string|Array} path
|
||
|
* @param {*} defaultValue (optional)
|
||
|
* @return {*}
|
||
|
*/
|
||
|
|
||
|
export var get = function get(obj, path) {
|
||
|
var defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
|
||
|
var val = getRaw(obj, path);
|
||
|
return isUndefinedOrNull(val) ? defaultValue : val;
|
||
|
};
|
||
|
export default get;
|