การทำให้เป็นทางการในสิ่งที่ถูกชี้ให้เห็นคือรีดิวเซอร์ (catamorphism) ซึ่งใช้สองข้อโต้แย้งซึ่งอาจเป็นประเภทเดียวกันโดยบังเอิญและส่งคืนชนิดที่ตรงกับอาร์กิวเมนต์แรก
function reducer (accumulator: X, currentValue: Y): X { }
นั่นหมายความว่าร่างกายของความต้องการลดที่จะเกี่ยวกับการแปลงcurrentValue
และมูลค่าปัจจุบันของค่าของใหม่accumulator
accumulator
สิ่งนี้ใช้งานได้อย่างตรงไปตรงมาเมื่อเพิ่มเนื่องจากค่าตัวสะสมและองค์ประกอบทั้งสองเกิดขึ้นเป็นประเภทเดียวกัน (แต่ให้บริการตามวัตถุประสงค์ที่ต่างกัน)
[1, 2, 3].reduce((x, y) => x + y);
มันใช้งานได้เพราะพวกมันเป็นตัวเลขทั้งหมด
[{ age: 5 }, { age: 2 }, { age: 8 }]
.reduce((total, thing) => total + thing.age, 0);
ตอนนี้เรากำลังให้ค่าเริ่มต้นแก่ผู้รวบรวม ค่าเริ่มต้นควรเป็นประเภทที่คุณคาดว่าตัวรวบรวมจะเป็น (ประเภทที่คุณคาดว่าจะออกมาเป็นค่าสุดท้าย) ในกรณีส่วนใหญ่ ในขณะที่คุณไม่ได้ถูกบังคับให้ทำเช่นนี้ (และไม่ควร) มันเป็นสิ่งสำคัญที่ต้องจำไว้
เมื่อคุณทราบแล้วคุณสามารถเขียนการลดความหมายสำหรับปัญหาความสัมพันธ์ n: 1 อื่น ๆ
การลบคำซ้ำ:
const skipIfAlreadyFound = (words, word) => words.includes(word)
? words
: words.concat(word);
const deduplicatedWords = aBunchOfWords.reduce(skipIfAlreadyFound, []);
พบจำนวนคำทั้งหมดที่พบ:
const incrementWordCount = (counts, word) => {
counts[word] = (counts[word] || 0) + 1;
return counts;
};
const wordCounts = words.reduce(incrementWordCount, { });
การลดอาร์เรย์ของอาร์เรย์ลงในอาร์เรย์เดียว:
const concat = (a, b) => a.concat(b);
const numbers = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
].reduce(concat, []);
เมื่อใดก็ตามที่คุณต้องการเปลี่ยนจากสิ่งต่าง ๆ เป็นค่าเดียวที่ไม่ตรงกับ 1: 1 การลดคือสิ่งที่คุณอาจพิจารณา
ในความเป็นจริงแล้วทั้งแผนที่และตัวกรองสามารถนำไปใช้เป็นการลด:
const map = (transform, array) =>
array.reduce((list, el) => list.concat(transform(el)), []);
const filter = (predicate, array) => array.reduce(
(list, el) => predicate(el) ? list.concat(el) : list,
[]
);
reduce
ฉันหวังว่านี้มีบางส่วนบริบทต่อไปสำหรับวิธีการใช้งาน
สิ่งหนึ่งที่นอกเหนือจากนี้ซึ่งฉันยังไม่ได้แบ่งคือเมื่อมีความคาดหวังว่าประเภทอินพุตและเอาต์พุตมีความหมายโดยเฉพาะว่าเป็นแบบไดนามิกเนื่องจากองค์ประกอบอาร์เรย์เป็นฟังก์ชัน:
const compose = (...fns) => x =>
fns.reduceRight((x, f) => f(x), x);
const hgfx = h(g(f(x)));
const hgf = compose(h, g, f);
const hgfy = hgf(y);
const hgfz = hgf(z);
arr.reduce(function(a,b){return a + b})
ในตัวอย่างที่สอง