-
-
Save pc035860/1e4936e074df9ed68454f8a5f6c16ec8 to your computer and use it in GitHub Desktop.
Simple, standalone, vanilla implementation of lodash.get
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Simple implementation of lodash.get | |
// Handles arrays, objects, and any nested combination of the two. | |
// Also handles undefined as a valid value - see test case for details. | |
// Based on: https://gist.github.com/harish2704/d0ee530e6ee75bad6fd30c98e5ad9dab | |
export function deepGet(obj, query, defaultVal) { | |
query = Array.isArray(query) ? query : query.replace(/(\[(\d)\])/g, '.$2').replace(/^\./, '').split('.'); | |
if (!(query[0] in obj)) { | |
return defaultVal; | |
} | |
obj = obj[query[0]]; | |
if (obj && query.length > 1) { | |
return deepGet(obj, query.slice(1), defaultVal); | |
} | |
return obj; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import deepGet from './deepGet.js'; | |
describe('deepGet', () => { | |
const testObj = { | |
a: { | |
b: { | |
c: { | |
d: 123 | |
} | |
}, | |
e: [ | |
{ f: 9 }, | |
{ g: 10 } | |
] | |
} | |
}; | |
const testArr = [ | |
{ id: 1, comments: [{ text: 'hello' }, { text: 'goodbye' }] }, | |
{ id: 2, comments: [] } | |
]; | |
const falseyObj = { | |
isUndefined: undefined, | |
isNull: null, | |
isZero: 0, | |
isEmptyString: '' | |
}; | |
it('handles nested objects', () => { | |
expect(deepGet(testObj, 'a.b.c.d')).toBe(123); | |
}); | |
it('handles arrays inside an object', () => { | |
expect(deepGet(testObj, 'a.e[0].f')).toBe(9); | |
}); | |
it('handles objects inside an array', () => { | |
expect(deepGet(testArr, '[0].comments[1].text')).toBe('goodbye'); | |
}); | |
it('returns the default value if query was not found', () => { | |
const defaultVal = 'oh no'; | |
expect(deepGet(testObj, 'invalid.not[0].found', defaultVal)).toBe(defaultVal); | |
}); | |
it('returns falsey values, including undefined', () => { | |
const defaultVal = 'my default'; | |
expect(deepGet(falseyObj, 'isUndefined', defaultVal)).toBe(undefined); | |
expect(deepGet(falseyObj, 'isNull', defaultVal)).toBe(null); | |
expect(deepGet(falseyObj, 'isZero', defaultVal)).toBe(0); | |
expect(deepGet(falseyObj, 'isEmptyString', defaultVal)).toBe(''); | |
}); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment