diff --git a/snippets/deepGet.md b/snippets/deepGet.md new file mode 100644 index 000000000..dd208a780 --- /dev/null +++ b/snippets/deepGet.md @@ -0,0 +1,25 @@ +### deepGet + +Returns the target value in a nested JSON object, based on the `keys` array. + +Compare the keys you want in the nested JSON object as an `Array`. +Use `Array.prototype.reduce()` to get value from nested JSON object one by one. +If the key exists in object, return target value, otherwise, return `null`. + +```js +const deepGet = (obj, keys) => keys.reduce((xs, x) => (xs && xs[x]) ? xs[x] : null, obj) +``` + +```js +let index = 2; +const data = { + foo: { + foz: [1, 2, 3], + bar: { + baz: ['a', 'b', 'c'] + } + } +}; +deepGet(data, ['foo', 'foz', index]); // get 3 +deepGet(data, ['foo', 'bar', 'baz', 8, 'foz']); // null +``` diff --git a/tag_database b/tag_database index 304a2441c..4ab4a39a7 100644 --- a/tag_database +++ b/tag_database @@ -53,6 +53,7 @@ decapitalize:string,array,intermediate deepClone:object,recursion,intermediate deepFlatten:array,recursion,intermediate deepFreeze:object,recursion,intermediate +deepGet:object,intermediate deepMapKeys:object,recursion,advanced defaults:object,intermediate defer:function,intermediate diff --git a/test/deepGet.test.js b/test/deepGet.test.js new file mode 100644 index 000000000..227a9a944 --- /dev/null +++ b/test/deepGet.test.js @@ -0,0 +1,40 @@ +const expect = require('expect'); +const {deepGet} = require('./_30s.js'); + +let idx = 2 +const data = { + level1: { + level2: { + level3: 'level3', + level3a: true, + level3b: [1, 2, 3, { level3c: 'level3c' }, 4, 5], + level3d: { + level4: [{ foo: 'foo' }, { bar: 'bar' }, { baz: 'baz' }] + } + } + } +}; + +test('deepGet is a Function', () => { + expect(deepGet).toBeInstanceOf(Function); +}); + +test('deepGet target success', () => { + expect(deepGet(data, ['level1', 'level2', 'level3'])).toEqual('level3'); +}); + +test('deepGet target and return null', () => { + expect(deepGet(data, ['level1', 'level2', 'foo', 'baz'])).toEqual(null); +}); + +test('deepGet target in an array', () => { + expect(deepGet(data, ['level1', 'level2', 'level3d', 'level4', 2, 'baz'])).toEqual('baz'); +}); + +test('deepGet target with variable key', () => { + expect(deepGet(data, ['level1', 'level2', 'level3b', idx])).toEqual(3); +}); + +test('deepGet target with empty Object', () => { + expect(deepGet({}, ['foo', 'bar', idx, 'foo'])).toEqual(null); +});