Implement .get() in Lodash

March 5, 2023

☕️ Support Us
Your support will help us to continue to provide quality content.👉 Buy Me a Coffee

What Is .get() In Lodash Doing?

.get() is a very commonly used utility function, it does the following things:

  • Given an object, and a path, return the value at the path
  • If the path does not exist in the given object, return the default value

It is easier to understand by example (the following examples are from Lodash source code)

const object = { a: [{ b: { c: 3 } }] };

//=> 3
get(object, "a[0].b.c");

//=> 3
get(object, 'a[0]["b"]["c"]');

//=> 'default
get(object, "a[100].b.c", "default");

As you can see, Lodash can accept various types of paths, the main reason is that there is a castPath helper function in the source code. castPath will convert the above "a[0].b.c", 'a[0]["b"]["c"]' and "a[100].b.c" to a more manageable form, ['a', '0', 'b', 'c'].

Therefore, if there is a built-in castPath, what .get() is actually doing is

// Create an object, for example
const object = { a: [{ b: { c: 3 } }] };

// Give a path, and find the value through .get(), for example
get(object, ["a", "0", "b", "c"]); // Return 3

Implement .get()

Now let's see how to implement .get()

function lodashGet(object, path, defaultValue) {
  // If the object is null, return the default value
  if (object == null) {
    return defaultValue;
  }

  let count = 0;
  const length = path.length;

  // Pass through the object one by one according to the path, for example
  // path[0] is 'a', so the first loop object will become object['a'] which is [{ b: { c: 3 } }]
  // After the first loop, count plus 1, so object will become object[path[1]]
  // which is [object['0']], which is { b: { c: 3 } }
  // Then count plus 1 again, so object will become object[path[2]]
  // which is object['b'], which is { c: 3 }
  // Then count plus 1 again, so object will become object[path[3]]
  // which is object['c'], which is 3
  // At this time count is 4, since length is also 4, so count is not less than length, so the while loop will be terminated
  while (object != null && count < length) {
    object = object[path[count++]];
  }

  // Because if the object is null, it will be terminated before the length is reached
  // In this case, it means that the path cannot be found, so it will be undefined
  // For example, if the path is ['a', '1', 'b', 'c']
  // Because object['1'] is undefined, so the while loop will be terminated when count is 2
  // In this case, the default value will be returned
  return count && count == length ? object : defaultValue;
}
☕️ Support Us
Your support will help us to continue to provide quality content.👉 Buy Me a Coffee