diff --git a/snippets/deepGetter.md b/snippets/deepGetter.md new file mode 100644 index 000000000..a6e6a3a3d --- /dev/null +++ b/snippets/deepGetter.md @@ -0,0 +1,24 @@ +### deepGetter + +Returns the target value in a nested JSON object, based on the keys array. + +Contrust 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 deepGetter = (obj, keys) => keys.reduce((xs, x) => (xs && xs[x]) ? xs[x] : null, obj) +``` + +```js +let idx = 2; // or variable from other places +const data = { + foo: { + foz: [1, 2, 3], + bar: { + baz: ['a', 'b', 'c'] + } + } +}; +deepGetter(data, ['foo', 'foz', idx]); // get 3 +deepGetter(data, ['foo', 'bar', 'baz', 8, 'foz']); // null +``` diff --git a/tag_database b/tag_database index 304a2441c..ee3ae6a54 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 +deepGetter:object,intermediate deepMapKeys:object,recursion,advanced defaults:object,intermediate defer:function,intermediate diff --git a/test/deepGetter.test.js b/test/deepGetter.test.js new file mode 100644 index 000000000..a82406692 --- /dev/null +++ b/test/deepGetter.test.js @@ -0,0 +1,40 @@ +const expect = require('expect'); +const {deepGetter} = 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('deepGetter is a Function', () => { + expect(deepGetter).toBeInstanceOf(Function); +}); + +test('deepGetter target success', () => { + expect(deepGetter(data, ['level1', 'level2', 'level3'])).toEqual('level3'); +}); + +test('deepGetter target and return null', () => { + expect(deepGetter(data, ['level1', 'level2', 'foo', 'baz'])).toEqual(null); +}); + +test('deepGetter target in an array', () => { + expect(deepGetter(data, ['level1', 'level2', 'level3d', 'level4', 2, 'baz'])).toEqual('baz'); +}); + +test('deepGetter target with variable key', () => { + expect(deepGetter(data, ['level1', 'level2', 'level3b', idx])).toEqual(3); +}); + +test('deepGetter target with empty Object', () => { + expect(deepGetter({}, ['foo', 'bar', idx, 'foo'])).toEqual(null); +});