0Pricing
Lua Academy · Урок

Преобразование таблиц: map, filter, reduce

Создавайте функциональные вспомогательные функции высшего порядка для преобразования таблиц.

«Преобразование таблиц: map, filter, reduce» — бесплатный урок Lua Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.

Функциональные шаблоны в Lua

В Lua нет встроенных функций отображения, фильтрации и свёртки, но их легко реализовать с помощью замыканий и обобщённых циклов for.

Отображение: преобразование каждого элемента

map применяет функцию к каждому элементу и возвращает новую таблицу с результатами.

local function map(t, fn)
  local result = {}
  for i, v in ipairs(t) do result[i] = fn(v) end
  return result
end
local doubled = map({1,2,3}, function(x) return x * 2 end)
print(table.concat(doubled, ", "))  -- 2, 4, 6

Фильтрация: сохранение подходящих элементов

filter сохраняет только те элементы, для которых предикат возвращает true.

local function filter(t, pred)
  local result = {}
  for _, v in ipairs(t) do
    if pred(v) then result[#result+1] = v end
  end
  return result
end
local evens = filter({1,2,3,4,5}, function(x) return x % 2 == 0 end)
print(table.concat(evens, ", "))  -- 2, 4

Свёртка: получение одного значения

reduce объединяет элементы слева направо с помощью аккумулятора.

local function reduce(t, fn, init)
  local acc = init
  for _, v in ipairs(t) do acc = fn(acc, v) end
  return acc
end
local sum = reduce({1,2,3,4,5}, function(a,b) return a+b end, 0)
print(sum)  -- 15

Цепочки операций

Объединяйте map, filter и reduce в цепочки для выразительной обработки потоков данных.

local nums = {1,2,3,4,5,6,7,8,9,10}
local result = reduce(
  map(
    filter(nums, function(x) return x % 2 == 0 end),
    function(x) return x * x end
  ),
  function(a,b) return a + b end, 0
)
print(result)  -- 220

forEach: побочные эффекты

forEach перебирает элементы, не создавая новую таблицу, что удобно для побочных эффектов, например вывода.

local function forEach(t, fn)
  for i, v in ipairs(t) do fn(v, i) end
end
forEach({"a","b","c"}, function(v, i) print(i, v) end)

flatMap: отображение с последующим уплощением

flatMap преобразует каждый элемент в список, а затем объединяет все списки.

local function flatMap(t, fn)
  local result = {}
  for _, v in ipairs(t) do
    for _, item in ipairs(fn(v)) do
      result[#result+1] = item
    end
  end
  return result
end
local expanded = flatMap({1,2,3}, function(x) return {x, x*10} end)

zip: объединение двух таблиц

zip объединяет элементы двух таблиц в таблицу пар.

local function zip(a, b)
  local result = {}
  for i = 1, math.min(#a, #b) do
    result[i] = {a[i], b[i]}
  end
  return result
end
local zipped = zip({1,2,3}, {"a","b","c"})

Работа с таблицами-словарями

Для таблиц «ключ—значение» используйте pairs, а не ipairs, и собирайте пары ключ—значение.

local function mapValues(t, fn)
  local result = {}
  for k, v in pairs(t) do result[k] = fn(v) end
  return result
end
local doubled = mapValues({x=1,y=2}, function(v) return v*2 end)

Концепция ленивого вычисления

Для больших наборов данных рассмотрите ленивые итераторы — замыкания, выдающие по одному элементу за раз. Это позволяет не создавать большие промежуточные таблицы.

Замечание о производительности

Каждый вызов map или filter выделяет новую таблицу. В тесных циклах изменение на месте может быть эффективнее, но это снижает неизменяемость и ясность кода.

Вопрос о reduce

Что возвращает reduce({1,2,3,4}, function(a,b) return a+b end, 0)?

Повторение: map, filter и reduce

map преобразует, filter отбирает, reduce сворачивает. Эти три функции высшего порядка образуют основу функциональной обработки данных в Lua.

Часто задаваемые вопросы

Урок «Преобразование таблиц: map, filter, reduce» бесплатный?

Да — полный текст урока «Преобразование таблиц: map, filter, reduce» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.

Чему я научусь в уроке «Преобразование таблиц: map, filter, reduce»?

Создавайте функциональные вспомогательные функции высшего порядка для преобразования таблиц. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Lua Academy?

Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Преобразование таблиц: map, filter, reduce»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Lua Academy?

Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. table.sort с компараторами
  2. table.concat и table.move
  3. Глубокое и поверхностное копирование
  4. Преобразование таблиц: map, filter, reduce
← Назад к Lua Academy