Гид по технологиям

Итерирование вложенных массивов в React

3 min read Frontend Обновлено 09 Jan 2026
Итерирование вложенных массивов в React
Итерирование вложенных массивов в React

Зелёное бетонное здание с геометрическим фасадом

Коротко о задаче

Большинство современных приложений получает данные через API. Эти данные часто содержат вложенные массивы — например, объект с полем, которое само является массивом. Чтобы отобразить такую структуру в React, обычно используют метод массива map для каждого уровня вложения.

Функция map — краткое напоминание

Метод map проходит по элементам массива и на каждый элемент возвращает значение или JSX-узел.

Пример для плоского массива:

const arr = ['a', 'b', 'c'];

const result1 = arr.map(element => {
  return element;
});

В React нужно поместить вызов map внутрь JSX в фигурные скобки и вернуть элемент (обычно с уникальным key):

const arr = ['a', 'b', 'c'];

function App() {
  return (
    <>
      {arr.map((item, index) => {
        return {item}
      })}
    
  )
}

Важно: назначайте ключи (key) для каждого возвращаемого элемента — это помогает React корректно обновлять список при изменениях.

Итерация вложенного массива в компоненте React

Рассмотрим пример структуры с рецептами, где у каждого рецепта есть поле dishTypes — массив типов блюда.

const recipes = [
  {
    id: 716429,
    title: "Pasta with Garlic, Scallions, Cauliflower & Breadcrumbs",
    image: "https://spoonacular.com/recipeImages/716429-312x231.jpg",
    dishTypes: [
      "lunch",
      "main course",
      "main dish",
      "dinner"
    ],
    recipe: {
      // recipe data
    }
  }
]

Для каждого уровня вложения используйте отдельный map. Пример компонента:

export default function Recipes() {
  return (
    
{recipes.map((recipe) => { return

{recipe.title}

изображение рецепта {recipe.dishTypes.map((type, index) => { return {type} })}
})}
) }

Советы по ключам:

  • Если у элементов есть уникальный идентификатор (id), используйте его как key.
  • Используйте индекс (index) только для статических списков или когда нет другого стабильного идентификатора.

Защищённый рендеринг и optional chaining

Данные из API могут быть неопределёнными. Прежде чем вызывать map, убедитесь, что значение — массив:

{Array.isArray(recipe.dishTypes) && recipe.dishTypes.map(type => {type})}

// или с optional chaining
{recipe.dishTypes?.map(type => {type})}

Это предотвращает ошибки типа “Cannot read property ‘map’ of undefined”.

Альтернативные подходы

  • flatMap / Array.prototype.flat: когда нужно объединить вложенные массивы в один плоский список. Подходит для преобразований, а не для структуры UI с вложенными блоками.
  • Рекурсивный рендеринг: если структура вложенности глубока и неизвестна заранее, рекурсивная функция проще обойдёт произвольную глубину.
  • Виртуализация (react-window, react-virtualized): при очень больших массивах для производительности.
  • Библиотеки-помощники (lodash): методы для безопасной работы с вложенными свойствами.

Пример flatMap (ES2019):

const allDishTypes = recipes.flatMap(r => r.dishTypes || []);

Когда map не подойдёт

  • Списки очень больших размеров — тогда нужен рендер с виртуализацией.
  • Если нужно сохранять состояние на уровне элемента и порядок изменяется динамически — тогда важно обеспечить стабильные ключи.
  • Для побочных эффектов: map должен возвращать элементы; для побочных эффектов используйте forEach или обычные циклы вне JSX.

Мини-методология: шаги перед рендером

  1. Изучите схему входных данных.
  2. Защитите доступ к полям (optional chaining или Array.isArray).
  3. Решите, какие поля дают уникальные ключи.
  4. Пройдитесь map для каждого уровня вложения.
  5. Проверьте консоль на предупреждения React о ключах.

Чек-лист для разработчика

  • Компонент не выбрасывает ошибок при пустых/undefined полях.
  • Все элементы списка имеют ключи; уникальные ключи используются, когда возможно.
  • Нет побочных эффектов внутри map, которые влияют на рендер.
  • Для больших списков рассмотрена виртуализация.
  • Тесты покрывают рендер при нескольких комбинациях входных данных.

Критерии приёмки

  • Компонент корректно отображает N элементов, соответствующих данным.
  • Для каждого вложенного массива отображаются все элементы в правильном порядке.
  • В консоли нет предупреждений React о дублирующихся ключах.
  • При пустых или отсутствующих массивах приложение не падает.

Краткий глоссарий

  • map: метод массива, возвращающий новый массив на основе функции-преобразователя.
  • JSX: синтаксис, позволяющий писать HTML-подобные узлы в JavaScript.
  • Reconciliation: процесс, которым React сравнивает виртуальный DOM с реальным для минимальных обновлений.

Итог

Map — основной инструмент для рендера массивов в React. Для вложенных структур применяйте map на каждом уровне, защищайте доступ к полям и назначайте корректные ключи. При больших объёмах данных подумайте о виртуализации или преобразовании данных заранее.

Важно: индекс как key — рабочее, но ограниченно применимое решение. По возможности используйте стабильные идентификаторы.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство