挖掘reduce的妙用,踏上数组操作新征程
2024-01-02 22:42:44
JavaScript 中 reduce 的 25 个高级用法:数组操作的超级英雄
想象一下你有一个庞大的数组,里面装满了各种各样的数据。你想要从这个数组中提取有价值的信息,并对其进行转换、分组或聚合。这就是 JavaScript 中的 reduce
函数的用武之地。它是一个强大的工具,可以将数组中的所有元素缩减为一个单一值,在数据处理和函数式编程中大放异彩。
1. 数组元素的归并:
最基本的功能,reduce
可以将数组中的元素归并为一个值,比如总和、平均值、最大值或最小值。
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((total, num) => total + num, 0); // 输出:15
2. 筛选并处理数组元素:
结合 filter
和 map
等方法,reduce
可以筛选和处理数组元素。
const evenNumbers = numbers.filter(num => num % 2 === 0);
const squaredEvenNumbers = evenNumbers.reduce((acc, num) => acc + num ** 2, 0); // 输出:20
3. 创建新数组:
利用 reduce
可以创建一个新数组,其中包含经过处理后的元素。
const students = [{ name: "Alice", age: 20 }, { name: "Bob", age: 25 }];
const names = students.reduce((acc, student) => [...acc, student.name], []); // 输出:["Alice", "Bob"]
4. 数组转换为对象:
将数组转换为对象,元素作为键和值。
const users = [{ id: 1, name: "John" }, { id: 2, name: "Mary" }];
const userObject = users.reduce((acc, user) => ({ ...acc, [user.id]: user.name }), {}); // 输出:{ 1: "John", 2: "Mary" }
5. 扁平化数组:
将多维数组扁平化为一维数组。
const nestedArray = [[1, 2], [3, 4], [5, 6]];
const flattenedArray = nestedArray.reduce((acc, subArray) => [...acc, ...subArray], []); // 输出: [1, 2, 3, 4, 5, 6]
6. 分组和聚合数据:
按属性对数据分组,然后对每个组进行聚合处理。
const salesData = [
{ product: "A", price: 10, quantity: 2 },
{ product: "B", price: 15, quantity: 1 },
{ product: "A", price: 20, quantity: 3 },
];
const groupedSales = salesData.reduce((acc, sale) => {
acc[sale.product] = acc[sale.product] || { product: sale.product, total: 0 };
acc[sale.product].total += sale.price * sale.quantity;
return acc;
}, {}); // 输出: { A: { product: "A", total: 50 }, B: { product: "B", total: 15 } }
7. 计算累积值:
计算数组元素的累积值。
const expenses = [100, 200, 300, 400];
const totalExpenses = expenses.reduce((total, expense) => total + expense, 0); // 输出:1000
8. 检测数组是否包含元素:
检测数组是否包含特定元素。
const colors = ["red", "green", "blue"];
const containsBlue = colors.reduce((found, color) => found || color === "blue", false); // 输出:true
9. 查找数组中的最大或最小值:
查找数组中的最大或最小值。
const temperatures = [20, 25, 30, 35, 40];
const maxTemp = temperatures.reduce((max, temp) => Math.max(max, temp), -Infinity); // 输出:40
10. 对数组元素进行排序:
对数组中的元素进行排序。
const unsortedNumbers = [5, 3, 1, 2, 4];
const sortedNumbers = unsortedNumbers.reduce((acc, num) => {
if (acc.length === 0) {
return [num];
}
let i = acc.length - 1;
while (i >= 0 && acc[i] > num) {
i--;
}
return [...acc.slice(0, i + 1), num, ...acc.slice(i + 1)];
}, []); // 输出: [1, 2, 3, 4, 5]
11. 数组元素转换为字符串:
将数组元素连接成字符串。
const words = ["Hello", "World", "!"];
const sentence = words.reduce((str, word) => str + " " + word); // 输出: "Hello World !"
12. 数组元素转换为数字:
将数组中的字符串元素转换为数字。
const numberStrings = ["1", "2", "3"];
const numbers = numberStrings.reduce((acc, num) => [...acc, +num], []); // 输出: [1, 2, 3]
13. 数组元素转换为布尔值:
将数组中的元素转换为布尔值。
const truthyValues = [true, false, true];
const boolValues = truthyValues.reduce((acc, val) => [...acc, Boolean(val)], []); // 输出: [true, false, true]
14. 数组元素转换为对象:
使用数组元素作为对象键和值创建对象。
const keyValuePairs = [["name", "John"], ["age", 20]];
const object = keyValuePairs.reduce((acc, [key, val]) => ({ ...acc, [key]: val }), {}); // 输出: { name: "John", age: 20 }
15. 数组元素转换为数组:
将数组元素连接成新数组。
const subArrays = [[1, 2], [3, 4], [5, 6]];
const flattenedArray = subArrays.reduce((acc, subArray) => [...acc, ...subArray], []); // 输出: [1, 2, 3, 4, 5, 6]
16. 数组元素转换为函数:
将数组元素作为参数创建函数。
const operations = ["+", "-", "*", "/"];
const calculate = operation => (a, b) => eval(`${a} ${operation} ${b}`);
const functions = operations.reduce((acc, op) => ({ ...acc, [op]: calculate(op) }), {}); // 输出: { "+": (a, b) => a + b, "-": (a, b) => a - b, "*": (a, b) => a * b, "/": (a, b) => a / b }
17. 数组元素转换为正则表达式:
将数组元素作为片段创建正则表达式。
const regexParts = ["[a-z]", "[0-9]", ".", "com"];
const regex = regexParts.reduce((acc, part) => acc + part, ""); // 输出: "[a-z][0-9].com"
18. 数组元素转换为日期:
将数组元素作为组成部分创建日期。
const dateParts = [2023, 3, 15];
const date = dateParts.reduce((d, part) => new Date(d.setFullYear(part, d.getMonth(), d.getDate())), new Date(0)); // 输出: "2023-03-15T00:00:00.000Z"
19. 数组元素转换为时间:
将数组元素作为组成部分创建时间。
const timeParts = [12, 0, 0];
const time = timeParts.reduce((t, part) => new Date(t.setHours(part, t.getMinutes(), t.getSeconds())), new Date(0)); // 输出: "1970-01-01T12:00:00.000Z"
20. 数组元素转换为货币:
将数组元素作为组成部分创建货币值。
const currencyParts = ["const currencyParts = ["$", 100, ".00"];
const currency = currencyParts.reduce
quot;, 100, ".00"];
const currency = currencyParts.reduce