walk
, that takes an object and an array of keys.for...of
loop and Object.keys()
to iterate over the keys of the object.typeof
to check if each value in the given object is itself an object.yield*
expression to recursively delegate to the same generator function, walk
, appending the current key
to the array of keys. Otherwise, yield
an array of keys representing the current path and the value of the given key
.yield*
expression to delegate to the walk
generator function.const walkThrough = function* (obj) { const walk = function* (x, previous = []) { for (let key of Object.keys(x)) { if (typeof x[key] === 'object') yield* walk(x[key], [...previous, key]); else yield [[...previous, key], x[key]]; } }; yield* walk(obj); };
const obj = { a: 10, b: 20, c: { d: 10, e: 20, f: [30, 40] }, g: [ { h: 10, i: 20 }, { j: 30 }, 40 ] }; [...walkThrough(obj)]; /* [ [['a'], 10], [['b'], 20], [['c', 'd'], 10], [['c', 'e'], 20], [['c', 'f', '0'], 30], [['c', 'f', '1'], 40], [['g', '0', 'h'], 10], [['g', '0', 'i'], 20], [['g', '1', 'j'], 30], [['g', '2'], 40] ] */
Subscribe to get resources directly to your inbox. You won't receive any spam! ✌️