Accessing nested product titles in Sanity collection array
This is a classic nested array issue! You're absolutely right that you need a second mapping. The problem is that collection.products is an array, so you can't access .title directly on it - you need to map through that array as well.
Here's how to fix it:
const Home = ({ product, collection }) => {
return (
<>
<Collection collection={collection} />
{(collection ?? []).map((collection) => (
<div key={collection.title}>
{/* Map through the products array */}
{(collection.products ?? []).map((product) => (
<div key={product._id || product.title}>
{product.title}
</div>
))}
</div>
))}
</>
);
};What's happening:
- Your first map iterates through the
collectionarray - Inside each collection,
collection.productsis another array of product objects - You need a second
.map()to iterate through each product in that array - Then you can access
product.titleon each individual product object
A few tips:
- I added the
?? []safety check oncollection.productstoo, in case a collection has no products - Use a unique key like
product._idif available (Sanity documents have_idfields), falling back toproduct.titleif needed - If you're just debugging, you could also do
{console.log(collection.products[0]?.title)}to see the first product's title
If you're still getting undefined:
Make sure your GROQ query is actually fetching the product data. If products is a reference field, you need to dereference it in your query:
*[_type == "collection"] {
title,
products[]-> {
title,
_id
}
}The -> operator dereferences the product references so you get the actual product data, not just the reference IDs. Check out the GROQ references documentation for more details on how dereferencing works in Sanity queries.
Show original thread12 replies
Sanity – Build the way you think, not the way your CMS thinks
Sanity is the developer-first content operating system that gives you complete control. Schema-as-code, GROQ queries, and real-time APIs mean no more workarounds or waiting for deployments. Free to start, scale as you grow.