Skip to content

Commit

Permalink
fix deepkeys to work with empty arrays and objects
Browse files Browse the repository at this point in the history
  • Loading branch information
Alex Kostyukov committed Apr 18, 2023
1 parent 7cfa81f commit 53e5c63
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 2 deletions.
4 changes: 3 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ const isObject = value => {
return value !== null && (type === 'object' || type === 'function');
};

const isEmptyObject = value => isObject(value) && Object.keys(value).length === 0;

const disallowedKeys = new Set([
'__proto__',
'prototype',
Expand Down Expand Up @@ -316,7 +318,7 @@ function stringifyPath(pathSegments) {
}

function * deepKeysIterator(object, currentPath = []) {
if (!isObject(object)) {
if (!isObject(object) || isEmptyObject(object)) {
if (currentPath.length > 0) {
yield stringifyPath(currentPath);
}
Expand Down
6 changes: 5 additions & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ console.log(getProperty(object, escapedPath));

### deepKeys(object)

Returns an array of every path. Plain objects are deeply recursed and are not themselves included.
Returns an array of every path. Plain not empty objects are deeply recursed and are not themselves included. Empty objects or objects without value are included, e.g [], {}, null, undefined, NaN

This can be useful to help flatten an object for an API that only accepts key-value pairs or for a tagged template literal.

Expand All @@ -122,12 +122,16 @@ const user = {
first: 'Richie',
last: 'Bendall',
},
activeTasks: [],
currentProject: null
};

for (const property of deepKeys(user)) {
console.log(`${property}: ${getProperty(user, property)}`);
//=> name.first: Richie
//=> name.last: Bendall
//=> activeTasks: []
//=> currentProject: null
}
```

Expand Down
14 changes: 14 additions & 0 deletions test.js
Original file line number Diff line number Diff line change
Expand Up @@ -413,13 +413,20 @@ test('escapePath', t => {

test('deepKeys', t => {
const object = {
eo: {},
ea: [],
'a.b': {
c: {
d: [1, 2, {
g: 3,
}],
e: '🦄',
f: 0,
h: {},
i: [],
nu: null,
na: Number.NaN,
un: undefined,
},
'': {
a: 0,
Expand All @@ -432,11 +439,18 @@ test('deepKeys', t => {
const keys = deepKeys(object);

t.deepEqual(keys, [
'eo',
'ea',
'a\\.b.c.d[0]',
'a\\.b.c.d[1]',
'a\\.b.c.d[2].g',
'a\\.b.c.e',
'a\\.b.c.f',
'a\\.b.c.h',
'a\\.b.c.i',
'a\\.b.c.nu',
'a\\.b.c.na',
'a\\.b.c.un',
'a\\.b..a',
'.a',
]);
Expand Down

0 comments on commit 53e5c63

Please sign in to comment.