Replace many lodash _.get()
calls with native ES expressions
#2515
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR removes most (about 97%) of calls to lodash's
_get()
method, which retrieves properties from nested objects, and returnsundefined
when the path does not exist:ECMAScript 2020 added native support for this with the optional chaining (
?.
) and nullish-coalescing (??
) operators. I think it's a good idea to switch to this pattern for a couple of reasons:_get()
method is opaque to typecheckers, making it harder to adopt type checking in MapRouletteFor those reasons, I took a stab at cleaning up usage of
_get()
in the codebase. Most of the changes in this PR were done by a script which I adapted to this purpose.There are a few places where the second argument to
_get()
comes from a function argument or subroutine return value, rather than being a string literal. It's not possible to tell automatically in these cases if the value is a simple identifier (safe to transform) or a complex keypath (requiring refactoring by hand). To avoid accidentally breaking any code, I left those cases alone for now.Once this is merged there are some other lodash methods I'd also like to replace with native equivalents (
_keys()
withObject.keys()
,_map
withArray.prototype.map()
, etc). Those should be easier than_get
to refactor automatically (find and replace will suffice in most cases).