liudong
2023-05-29 340f156319b863525e50e900c58e59b86ecb3d5e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
'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)
}