From c78f4bfc93fa4cea5b42693a1b5a1887909e7aff Mon Sep 17 00:00:00 2001 From: petesamper Date: Sat, 18 Apr 2020 18:17:07 -0400 Subject: [PATCH 1/4] feat: adds the checkNested function with unit tests feat #8 --- src/checkNested.js | 13 +++++++++++++ src/index.js | 15 ++++++++------- src/tests/checkNested.test.js | 27 +++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 src/checkNested.js create mode 100644 src/tests/checkNested.test.js diff --git a/src/checkNested.js b/src/checkNested.js new file mode 100644 index 0000000..f1c670a --- /dev/null +++ b/src/checkNested.js @@ -0,0 +1,13 @@ +/** + * A function to deeply compare objects + * @param {Object} obj - Object to examine + * @param {String} level - path of keys as seperated strings + * @return {Boolean} + */ +const checkNested = (obj, level, ...parameters) => { + if (obj === undefined) return false; + if (parameters.length == 0 && obj.hasOwnProperty(level)) return true; + return checkNested(obj[level], ...parameters); +}; + +module.exports = checkNested; diff --git a/src/index.js b/src/index.js index 9f3fb2e..60d6c61 100644 --- a/src/index.js +++ b/src/index.js @@ -1,7 +1,8 @@ -export { default as flatten } from "./flatten.js"; -export { default as deepCopy } from "./deepCopy.js"; -export { default as isPrime } from "./isPrime.js"; -export { default as peek } from "./peek.js"; -export { default as sieveOfE } from "./sieveOfE.js"; -export { default as sort } from "./sort.js"; -export { default as camelCase } from "./camelCase.js"; +export { default as flatten } from './flatten.js'; +export { default as deepCopy } from './deepCopy.js'; +export { default as isPrime } from './isPrime.js'; +export { default as peek } from './peek.js'; +export { default as sieveOfE } from './sieveOfE.js'; +export { default as sort } from './sort.js'; +export { default as camelCase } from './camelCase.js'; +export { default as checkNested } from './checkNested'; diff --git a/src/tests/checkNested.test.js b/src/tests/checkNested.test.js new file mode 100644 index 0000000..f573116 --- /dev/null +++ b/src/tests/checkNested.test.js @@ -0,0 +1,27 @@ +const expect = require('chai').expect; +const checkNested = require('../').checkNested; + +describe('checkNested', () => { + it('returns true if an object has nested values', () => { + const objOne = { + name: { + first: 'Pete', + favorite: { + color: 'blue', + }, + }, + }; + expect(checkNested(objOne, 'name', 'favorite', 'color')).to.equal(true); + }); + it('returns false if an object has nested values', () => { + const objTwo = { + name: { + first: 'Pete', + favorite: { + color: 'blue', + }, + }, + }; + expect(checkNested(objTwo, 'name', 'favorite', 'food')).to.equal(false); + }); +}); From 5d68b5741dcf68477af3772dc992de0ec8195db8 Mon Sep 17 00:00:00 2001 From: petesamper Date: Mon, 20 Apr 2020 21:24:05 -0400 Subject: [PATCH 2/4] finally figured it out --- src/checkNested.js | 35 +++++++++++++++++++++++++++++++---- src/tests/checkNested.test.js | 12 ++++++------ 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/checkNested.js b/src/checkNested.js index f1c670a..dbbf037 100644 --- a/src/checkNested.js +++ b/src/checkNested.js @@ -4,10 +4,37 @@ * @param {String} level - path of keys as seperated strings * @return {Boolean} */ -const checkNested = (obj, level, ...parameters) => { - if (obj === undefined) return false; - if (parameters.length == 0 && obj.hasOwnProperty(level)) return true; - return checkNested(obj[level], ...parameters); +// const checkNested = (obj, level, ...parameters) => { +// if (obj === undefined) return false; +// if (parameters.length == 0 && obj.hasOwnProperty(level)) return true; +// return checkNested(obj[level], ...parameters); +// }; + +const checkNested = (object, searchKey) => { + // If bad input, return false: + if (object === null || object === undefined) { + return false; + } + + for (let key of Object.keys(object)) { + // Iterate through keys for match: + if (key === searchKey) { + return true; + } else { + const aNestedObject = object[key]; + + // If key isn't a match, try to see if the key's value is an object. + // if it is, we need to search through it's keys: + if (typeof aNestedObject === 'object') { + // We can recursively search for our searchKey in + // nested value, passing in objectSubKey (nested object) this time: + if (checkNested(aNestedObject, searchKey) === true) { + return true; + } + } + } + } + return false; }; module.exports = checkNested; diff --git a/src/tests/checkNested.test.js b/src/tests/checkNested.test.js index f573116..52ae5f5 100644 --- a/src/tests/checkNested.test.js +++ b/src/tests/checkNested.test.js @@ -2,8 +2,8 @@ const expect = require('chai').expect; const checkNested = require('../').checkNested; describe('checkNested', () => { - it('returns true if an object has nested values', () => { - const objOne = { + it('returns true if object contains search key', () => { + const object = { name: { first: 'Pete', favorite: { @@ -11,10 +11,10 @@ describe('checkNested', () => { }, }, }; - expect(checkNested(objOne, 'name', 'favorite', 'color')).to.equal(true); + expect(checkNested(object, 'favorite')).to.equal(true); }); - it('returns false if an object has nested values', () => { - const objTwo = { + it('returns false if object does not contain search key', () => { + const object = { name: { first: 'Pete', favorite: { @@ -22,6 +22,6 @@ describe('checkNested', () => { }, }, }; - expect(checkNested(objTwo, 'name', 'favorite', 'food')).to.equal(false); + expect(checkNested(object, 'movie')).to.equal(false); }); }); From b4ccd1d32630ce6a35cafaa4b97b8eb18c122c03 Mon Sep 17 00:00:00 2001 From: petesamper Date: Mon, 20 Apr 2020 21:32:45 -0400 Subject: [PATCH 3/4] added to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3999f55..30ae03c 100644 --- a/README.md +++ b/README.md @@ -33,4 +33,5 @@ This is a tiny library of javascript functions, currently comprising: - isEqual - inPlaceShuffle - regularShuffle +- checkNested From 23bd0f8432bdb1c78774f69e0c539916dc0fc6ed Mon Sep 17 00:00:00 2001 From: petesamper Date: Mon, 20 Apr 2020 21:38:38 -0400 Subject: [PATCH 4/4] updated JSdoc and deleted junk --- src/checkNested.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/checkNested.js b/src/checkNested.js index dbbf037..b9212ff 100644 --- a/src/checkNested.js +++ b/src/checkNested.js @@ -1,14 +1,9 @@ /** * A function to deeply compare objects * @param {Object} obj - Object to examine - * @param {String} level - path of keys as seperated strings + * @param {String} key you are searching for * @return {Boolean} */ -// const checkNested = (obj, level, ...parameters) => { -// if (obj === undefined) return false; -// if (parameters.length == 0 && obj.hasOwnProperty(level)) return true; -// return checkNested(obj[level], ...parameters); -// }; const checkNested = (object, searchKey) => { // If bad input, return false: