返回

挖掘reduce的妙用,踏上数组操作新征程

前端

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. 筛选并处理数组元素:

结合 filtermap 等方法,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