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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ฟังก์ชันในฐานะค่า
- map, filter, reduce
- การประยุกต์ใช้บางส่วน
- การประกอบฟังก์ชัน