bigint-crypto-utils/node_modules/object-get/lib/object-get.js

55 lines
1.4 KiB
JavaScript
Raw Normal View History

'use strict'
/**
* Access nested property values at any depth with a simple expression.
*
* @module object-get
* @typicalname objectGet
* @example
* ```js
* const objectGet = require('object-get')
*
* const colour = objectGet(mammal, 'fur.appearance.colour')
* const text = objectGet(el, 'children[2].children[1].children[1].textContent')
* ```
*
* Helps avoid long logical expressions like:
*
* ```js
* const colour = mammal && mammal.fur && mammal.fur.appearance && mammal.fur.appearance.colour
* ```
*/
module.exports = objectGet
/**
* Returns the value at the given property.
*
* @param {object} - the input object
* @param {string} - the property accessor expression.
* @returns {*}
* @alias module:object-get
* @example
* > objectGet({ animal: 'cow' }, 'animal')
* 'cow'
*
* > objectGet({ animal: { mood: 'lazy' } }, 'animal')
* { mood: 'lazy' }
*
* > objectGet({ animal: { mood: 'lazy' } }, 'animal.mood')
* 'lazy'
*
* > objectGet({ animal: { mood: 'lazy' } }, 'animal.email')
* undefined
*/
function objectGet (object, expression) {
if (!(object && expression)) throw new Error('both object and expression args are required')
return expression.trim().split('.').reduce(function (prev, curr) {
var arr = curr.match(/(.*?)\[(.*?)\]/)
if (arr) {
return prev && prev[arr[1]] && prev[arr[1]][arr[2]]
} else {
return prev && prev[curr]
}
}, object)
}