By the end of this tutorial, you’ll use wrapper .at() inside Lodash chains to pluck nested values by path and unwrap with .value().
01
Chain syntax
_(obj).at(paths)
02
Path plucking
Dotted & bracket paths.
03
Array result
Always returns value[].
04
vs _.at()
Same logic, chain style.
05
vs _.get()
Many paths at once.
06
Unwrap
Finish with .value().
Fundamentals
What Is Wrapper .at()?
Wrapper .at() is the chainable version of _.at(). Call it on a Lodash sequence wrapper to extract values at one or more property paths from the wrapped object or array, then continue chaining or unwrap with .value().
💡
Not _.prototype.at()
There is no _.prototype.at() function. The correct call is _(object).at('a.b.c').value() or _.chain(object).at(['name', 'email']).value().
Use wrapper .at() when you already have a chain and want to pluck several nested fields in one step—API responses, form prefill data, or config snapshots.
Foundation
📝 Syntax
Call .at() on a wrapper; pass one path or many:
javascript
_(object).at(paths)
// or
_.chain(object).at(path1, path2, ...)
Syntax Rules
paths — string path(s), array of paths, or rest arguments ('a', 'b.c').
Return (after .value()) — always an array of values in path order.
Missing paths — yield undefined at that index; no exception is thrown.
Nested paths — use dot notation ('address.city') or bracket segments ('a[0].b').
Keys with dots — use array paths: [['weird.key']] (see _.at()).
Start with _(object) or _.chain(object) so Lodash knows the source for path resolution.
Input
2
Call .at(paths)
Lodash resolves each path against the wrapped value—dot notation, brackets, and array indices all work.
Pluck
3
Unwrap with .value()
The pipeline runs and you receive a plain array of extracted values, ordered to match your paths.
Unwrap
=
⚡
Same logic as _.at()
Wrapper .at() delegates to _.at()—use it when path plucking belongs in the middle of a longer chain.
Important
📝 Notes
There is no _.prototype.at() function—the correct name is wrapper .at() on a sequence object.
After .value(), the result is always an array, even for a single path ([value]).
Missing paths yield undefined at that index; Lodash does not throw.
For one nested value with a default, prefer chainable .get(path, default) or _.get().
For top-level keys only (returning an object), use _.pick() instead.
Path syntax matches the direct _.at() tutorial—including bracket notation for arrays.
Wrap Up
Conclusion
Wrapper .at() lets you pluck one or many nested values inside a Lodash chain. Pass path strings, unwrap with .value(), and get an ordered array of results. It is the fluent companion to _.at()—ideal for API responses, form prefill, and config parsing when you are already chaining.
Next in the wrapper prototype series: .chain(), which re-wraps a value mid-pipeline for nested sequences.
Use wrapper .at() when plucking several nested paths inside an existing chain
Keep path lists in named constants (const FIELDS = [...]) for reuse and clarity
Check for undefined slots when paths may be missing on partial data
Use .get() when you only need one value with an optional default
Read the _.at() tutorial for advanced path edge cases
❌ Don’t
Call it _.prototype.at()—that name does not exist in Lodash
Expect a single scalar when one path is passed—result is always an array
Use .at() for top-level key picking when .pick() returns a cleaner object
Forget .value() and treat the wrapper as the final array
Wrap just for .at() when a direct _.at(obj, paths) call is simpler
Summary
Key Takeaways
Knowledge Unlocked
Five things to remember about wrapper .at()
Use these when plucking nested paths inside Lodash chains.
5
Core concepts
🔍01
Chain pluck
_(obj).at(...)
Core
📦02
Array result
Always [values].
Return
🔗03
Same as _.at
Direct equivalent.
Equivalent
📈04
vs .get()
Many paths vs one.
Compare
⚠️05
Missing paths
undefined slots.
Safety
❓ Frequently Asked Questions
Inside a Lodash chain, .at(paths) plucks values from the wrapped object or array at the given path(s) and returns another wrapper. Call .value() to get the plain array of extracted values.
Yes—wrapper .at() delegates to the same logic as _.at(object, paths). The difference is syntax: _(obj).at('a.b').value() versus _.at(obj, 'a.b').
Always an array. One path yields a one-element array; multiple paths yield values in the same order as the paths you passed.
_.get reads one path and returns a single value (with optional default). .at reads one or many paths and always returns an array of values—better for plucking several fields at once.
The corresponding array slot is undefined. Lodash does not throw—check for undefined when paths may be absent.
Yes. .at() runs on the current wrapped value. Common pattern: _(apiResponse).at(['data.name', 'data.email']).value() to pull fields before further transforms.
Did you know?
Wrapper .at() always returns an array—even when you pass a single path like 'a.b.c', you get [value] after .value(). That is why _.get() is better when you need one scalar with a default, while .at() shines when plucking several fields in order.