Самый простой способ это добавить поле на бэке в основное тело сущности при учете определенных фильтров, например цвета. И надо декомпозировать, чтобы не тащить все вплоть до изображения. Не очень понятно что значит перво попавшуюся, вряд ли же подойдут и из других товаров и ведь нужно отталкиваться от правильно выбранного цвета?
Но если ответ всегда такой, то можно так, возьмем для пример один из присланных вами товаров и распарсим.
const jsonString = `{"items":[{"id":2,"title":"Футболка","slug":"futbolka","price":1000,"colors":[{"id":77,"color":{"id":27,"title":"white","code":"#ffffff"},"gallery":[{"file":{"url":"ссылка на изображение","name":"36efa79c31cb4400f8f9ce69a7d6f6a6.png","originalName":"Rectangle 13++.png","extension":"png","size":"63.5 Кб"}}]}],"seasons":[{"id":3,"title":"Лето","code":"summer","productsCount":10}],"materials":[{"id":1,"title":"Хлопок","code":"cotton","productsCount":6},{"id":2,"title":"Шерсть","code":"wool","productsCount":4}]}]}`;
const data = JSON.parse(jsonString);
// дальше перебором ищем где есть изображение
if (data?.items[0]?.colors.length) {
for (let i = 0; i <= data.items[0].colors.length; i++) {
// проваливаемся в еще один цикл уже на элементы в gallery, и там ищем url, и если есть то заканчиваем цикл через r
for (let j = 0; j <= data.items[0].colors[i].length; j++) {
//и еще цикл на галерии
for (let n = 0; n <= data.items[0].colors[i].gallery.length; j++) {
if (data?.items[0]?.colors[i]?.gallery[n]?.url) {
return data.items[0].colors[i].gallery[n].url;
}
}
}
}
}
// не забудьте дописать выход из всех циклов
но это выглядит очень странно, можно еще чрез forEach, но его не оставить, тч если будет миллион товаров то все упадет
items.forEach(item => {
const keys = Object.keys(item);
let imageKey = '';
keys.some(key => {
if (typeof item[key] === 'object' && item[key] !== null) {
const subkeys = Object.keys(item[key]);
const file = subkeys.find(subkey => {
if (typeof item[key][subkey] === 'object' && item[key][subkey] !== null) {
return item[key][subkey].hasOwnProperty('url');
}
return false;
});
if (file) {
imageKey = key;
return true;
}
}
return false;
});
return `${item.title}" "${imageKey}`;
// можно дальше делать что угодно с ключем или сразу брать изображение
});
Но честно говоря я бы еще раз подумал над ТЗ :) И точно бы вел довел бы до дочернего элемента только содержимое
gallery и тогда можно обойтись без этих безумств. И проверить уже только элементы внутри
gallery