0Pricing
Lua Academy · บทเรียน

map, filter, reduce

สร้างตัวช่วยระดับสูง

map, filter, reduce เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

สามเครื่องมือสำคัญ

การแมป การกรอง และการลดรูปเป็นเครื่องมือหลักของการประมวลผลรายการเชิงฟังก์ชัน แต่ละอย่างรับรายการกับฟังก์ชัน และคืนผลลัพธ์โดยที่คุณไม่ต้องเขียนการวนซ้ำเอง

Lua ไม่ได้มีเครื่องมือเหล่านี้มาให้ในตัว แต่เขียนได้สั้น ๆ และช่วยให้เห็นวิธีทำงานของฟังก์ชันระดับสูง

การแมป: แปลงสมาชิกแต่ละรายการ

การแมปจะใช้ฟังก์ชันกับสมาชิกทุกตัว แล้วรวบรวมผลลัพธ์เป็นรายการใหม่ รายการเดิมจะไม่เปลี่ยนแปลง

ฟังก์ชันที่คุณส่งเข้าไปเป็นผู้กำหนดการแปลง ดังนั้น map หนึ่งฟังก์ชันจึงรองรับการเพิ่มเป็นสองเท่า การยกกำลังสอง หรือการเปลี่ยนแปลงสมาชิกแต่ละตัวแบบใดก็ได้

local function map(t, f)
  local out = {}
  for i, v in ipairs(t) do
    out[i] = f(v)
  end
  return out
end

local r = map({1, 2, 3}, function(x) return x * x end)
print(table.concat(r, ", "))

การแมปจะรักษาความยาวไว้

การแมปจะคืนรายการที่มีจำนวนสมาชิกเท่ากับ input เสมอ สมาชิก input แต่ละตัวจะถูกแมปไปยัง output หนึ่งตัวพอดี

หากคุณต้องการตัดสมาชิกออก นั่นเป็นหน้าที่ของการกรอง ไม่ใช่การแมป

local function map(t, f)
  local out = {}
  for i, v in ipairs(t) do out[i] = f(v) end
  return out
end

local names = {"ada", "lin", "sam"}
local caps = map(names, string.upper)
print(table.concat(caps, " "))
print(#caps)

การกรอง: เก็บบางสมาชิกไว้

การกรองจะเก็บเฉพาะสมาชิกที่ฟังก์ชันเงื่อนไขคืนค่าเป็น true ฟังก์ชันเงื่อนไขคือฟังก์ชันที่คืนค่าบูลีน

ผลลัพธ์เป็นรายการใหม่ที่อาจสั้นกว่ารายการเดิม แต่จะไม่ยาวกว่าเดิม

local function filter(t, pred)
  local out = {}
  for _, v in ipairs(t) do
    if pred(v) then out[#out + 1] = v end
  end
  return out
end

local evens = filter({1,2,3,4,5,6}, function(x) return x % 2 == 0 end)
print(table.concat(evens, ", "))

การกรองรักษาลำดับไว้

การกรองจะเดินผ่านรายการตามลำดับและต่อสมาชิกแต่ละตัวที่ผ่านเงื่อนไขเข้าไป ดังนั้นสมาชิกที่เหลืออยู่จึงยังคงลำดับเดิม

การใช้ #out + 1 เป็นดัชนีช่วยให้ผลลัพธ์เป็นอาร์เรย์ที่ไม่มีช่องว่าง ซึ่ง Lua จะถือว่าเป็นลำดับที่ถูกต้อง

local function filter(t, pred)
  local out = {}
  for _, v in ipairs(t) do
    if pred(v) then out[#out + 1] = v end
  end
  return out
end

local long = filter({"hi", "hello", "yo", "howdy"},
  function(s) return #s > 2 end)
print(table.concat(long, ", "))

การลดรูป: รวมเป็นค่าเดียว

การลดรูป หรือที่เรียกว่าการพับรวม จะยุบรายการให้เหลือค่าเดียว โดยมีตัวสะสมและรวมตัวสะสมเข้ากับสมาชิกแต่ละตัวด้วยฟังก์ชันของคุณ

คุณกำหนดค่าเริ่มต้นและฟังก์ชันรวมค่า จากนั้นการลดรูปจะส่งต่อตัวสะสมผ่านสมาชิกทุกตัว

local function reduce(t, f, acc)
  for _, v in ipairs(t) do
    acc = f(acc, v)
  end
  return acc
end

local sum = reduce({1,2,3,4}, function(a, x) return a + x end, 0)
print(sum)

การลดรูปเพื่อหาค่าสูงสุด

การลดรูปไม่ได้จำกัดอยู่แค่การคำนวณทางคณิตศาสตร์ ฟังก์ชันรวมค่าสามารถเปรียบเทียบค่าและเก็บค่าที่มากกว่าไว้ในแต่ละขั้นได้

การเริ่มตัวสะสมด้วยสมาชิกตัวแรกหรือด้วยค่าที่เล็กมาก ช่วยให้การลดรูปค้นหาค่าสูงสุดได้อย่างเรียบร้อย

local function reduce(t, f, acc)
  for _, v in ipairs(t) do acc = f(acc, v) end
  return acc
end

local product = reduce({1,2,3,4,5}, function(a, x) return a * x end, 1)
print(product)

การลดรูปมีความยืดหยุ่น

เมื่อเปลี่ยนฟังก์ชันรวมค่าและค่าเริ่มต้น การลดรูปก็สามารถหาผลรวม คูณค่า ค้นหาค่าสูงสุด หรือสร้างสตริงได้

ในที่นี้ตัวสะสมเริ่มต้นที่ 1 และทำการคูณ จึงได้ผลคูณในลักษณะเดียวกับแฟกทอเรียล

local function reduce(t, f, acc)
  for _, v in ipairs(t) do acc = f(acc, v) end
  return acc
end

local max = reduce({3, 8, 2, 11, 6},
  function(a, x) if x > a then return x else return a end end, -math.huge)
print(max)

เชื่อมการทำงานเข้าด้วยกัน

พลังที่แท้จริงจะปรากฏเมื่อคุณเชื่อมเครื่องมือทั้งสามเข้าด้วยกัน การกรองจะทำให้ข้อมูลแคบลง การแมปจะแปลงข้อมูล และการลดรูปจะสรุปข้อมูล

แต่ละขั้นเป็นขั้นตอนเล็ก ๆ ที่ชัดเจน และเมื่อนำมารวมกันก็สามารถแทนการวนซ้ำด้วยตนเองที่ยุ่งเหยิงได้

local function filter(t, p) local o={} for _,v in ipairs(t) do if p(v) then o[#o+1]=v end end return o end
local function map(t, f) local o={} for i,v in ipairs(t) do o[i]=f(v) end return o end
local function reduce(t, f, a) for _,v in ipairs(t) do a=f(a,v) end return a end

local nums = {1,2,3,4,5,6}
local r = reduce(map(filter(nums, function(x) return x%2==0 end),
  function(x) return x*x end), function(a,x) return a+x end, 0)
print(r)

ข้อมูลเดิมยังคงปลอดภัย

การแมปและการกรองจะสร้างตารางใหม่เสมอและไม่แก้ไข input ทำให้กระบวนการต่อเนื่องคาดเดาได้ ข้อมูลจากขั้นก่อนหน้ายังคงใช้งานได้หลังผ่านแต่ละขั้น

การลดรูปก็ไม่เปลี่ยนแปลงรายการเช่นกัน แต่คืนเฉพาะผลลัพธ์ที่รวมแล้ว

ใช้ได้กับรายการทุกชนิด

เนื่องจากฟังก์ชันเป็นพารามิเตอร์ เครื่องมือเหล่านี้จึงทำงานกับข้อมูลทุกชนิดได้ map เดียวกันสามารถเปลี่ยนสตริงเป็นตัวพิมพ์ใหญ่ ปรับขนาดราคา หรือจัด format ระเบียนได้

การเขียนการวนซ้ำเพียงครั้งเดียวแล้วส่งฟังก์ชันที่แตกต่างกันเข้าไป คือเหตุผลสำคัญที่ฟังก์ชันชั้นหนึ่งมีประโยชน์มาก

local function map(t, f) local o={} for i,v in ipairs(t) do o[i]=f(v) end return o end

local prices = {10, 20, 30}
local withTax = map(prices, function(p) return p * 1.18 end)
print(table.concat(withTax, ", "))

ตรวจสอบอย่างรวดเร็ว

ลองพิจารณาว่าการดำเนินการเหล่านี้ส่งผลต่อความยาวของรายการอย่างไร

สรุป

การแมปจะแปลงสมาชิกแต่ละตัวและรักษาความยาวไว้ การกรองจะเก็บสมาชิกที่ผ่านฟังก์ชันเงื่อนไข และการลดรูปจะพับรายการให้เป็นค่าเดียวด้วยตัวสะสม

การเชื่อมการกรอง การแมป และการลดรูปเข้าด้วยกันจะสร้างกระบวนการต่อเนื่องของข้อมูลที่ชัดเจนโดยไม่ต้องเขียนการวนซ้ำเอง และตารางเดิมจะไม่เปลี่ยนแปลง

คำถามที่พบบ่อย

บทเรียน “map, filter, reduce” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “map, filter, reduce” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “map, filter, reduce”

สร้างตัวช่วยระดับสูง คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “map, filter, reduce” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ฟังก์ชันในฐานะค่า
  2. map, filter, reduce
  3. การประยุกต์ใช้บางส่วน
  4. การประกอบฟังก์ชัน
← กลับไปที่ Lua Academy