walkThrough
Creates a generator, that walks through all the keys of a given object.
- Use recursion.
 - Define a generator function, 
walk, that takes an object and an array of keys. - Use a 
for...ofloop andObject.keys()to iterate over the keys of the object. - Use 
typeofto check if each value in the given object is itself an object. - If so, use the 
yield*expression to recursively delegate to the same generator function,walk, appending the currentkeyto the array of keys. Otherwise,yieldthe an array of keys representing the current path and the value of the givenkey. - Use the 
yield*expression to delegate to thewalkgenerator 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]
]
*/