首页 > 其他分享 >JS 中的 reduce使用举例技巧。

JS 中的 reduce使用举例技巧。

时间:2023-08-17 11:23:49浏览次数:38  
标签:acc const name reduce JS 举例 数组 id

1. 计算数组中元素的总和

这是reduce最常见的用法之一,可以用来计算数组中所有元素的总和。例如,如果我们有一个包含数字的数组,我们可以用reduce来求和:

const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((acc, cur) => acc + cur, 0);
console.log(sum); // 15

2. 计算数组中元素的平均值

类似于求和,我们也可以用reduce来计算数组中元素的平均值。我们只需要在回调函数中将累计值除以数组的长度即可:

const numbers = [1, 2, 3, 4, 5];
const average = numbers.reduce((acc, cur) => acc + cur, 0) / numbers.length;
console.log(average); // 3

3. 计算数组中元素的最大值或最小值

除了求和和求平均,我们还可以用reduce来找出数组中元素的最大值或最小值。我们只需要在回调函数中使用Math.max或Math.min方法来比较累计值和当前元素,并返回较大或较小的那个:

const numbers = [1, 2, 3, 4, 5];
const max = numbers.reduce((acc, cur) => Math.max(acc, cur), -Infinity);
console.log(max); // 5
const min = numbers.reduce((acc, cur) => Math.min(acc, cur), Infinity);
console.log(min); // 1

4. 将数组转换为对象

reduce不仅可以用来对数组进行数学运算,还可以用来将数组转换为其他类型的数据结构,例如对象。例如,如果我们有一个包含键值对的二维数组,我们可以用reduce来将它转换为一个对象:

const entries = [['name', 'Alice'], ['age', 18], ['gender', 'female']];
const obj = entries.reduce((acc, cur) => {
  acc[cur[0]] = cur[1];
  return acc;
}, {});
console.log(obj); // {name: "Alice", age: 18, gender: "female"}

5. 将对象转换为数组

反过来,我们也可以用reduce来将对象转换为数组,例如:

const obj = {
  name: 'Alice',
  age: 25,
  gender: 'female'
};

const arr = Object.keys(obj).reduce((acc, key) => {
  acc.push([key, obj[key]]);
  return acc;
}, []);

console.log(arr); // [['name', 'Alice'], ['age', 25], ['gender', 'female']]

6、统计一个数组中每个元素出现的次数

如果我们想要统计一个数组中每个元素出现的次数,我们可以使用reduce方法来实现。例如:

let arr = ['a', 'b', 'c', 'a', 'b'];
let count = arr.reduce((obj, item) => {
  // 如果对象中已经有了这个键,就让它的值加一
  if (obj[item]) {
    obj[item]++;
  } else {
    // 如果对象中没有这个键,就初始化为一
    obj[item] = 1;
  }
  // 返回对象作为下一次的累计值
  return obj;
}, {}); // 初始值为空对象
console.log(count); // {a: 2, b: 2, c: 1}

7、按条件分组

假设我们有一个包含学生信息的数组,每个对象都有name和score属性,我们想要按照score是否大于等于60来分组,即及格和不及格。我们可以使用reduce这样做:

// 定义一个学生数组
const students = [
  {name: 'Alice', score: 75},
  {name: 'Bob', score: 59},
  {name: 'Charlie', score: 82},
  {name: 'David', score: 48},
  {name: 'Eve', score: 66}
];

// 使用reduce按条件分组
const groups = students.reduce((acc, cur) => {
  // 判断当前对象的score是否大于等于60
  const key = cur.score >= 60 ? 'pass' : 'fail';
  // 如果累积对象中还没有这个key,就创建一个空数组
  if (!acc[key]) {
    acc[key] = [];
  }
  // 将当前对象推入对应的数组
  acc[key].push(cur);
  // 返回累积对象
  return acc;
}, {}); // 初始值为一个空对象

// 打印结果
console.log(groups);
/*
{
  pass: [
    { name: 'Alice', score: 75 },
    { name: 'Charlie', score: 82 },
    { name: 'Eve', score: 66 }
  ],
  fail: [
    { name: 'Bob', score: 59 },
    { name: 'David', score: 48 }
  ]
}
*/

8、将多数组合并为一个对象

将多个数组合并为一个对象,例如,将一个包含用户信息的数组和一个包含用户订单的数组合并为一个包含用户信息和订单的对象。这样可以方便地对数据进行分析和处理。

要实现这个功能,我们可以使用reduce方法的第二个参数,即初始值。初始值可以是任何类型的值,包括一个空对象。然后,在reduce方法的回调函数中,我们可以根据数组元素的某个属性(例如用户ID)来判断是否已经存在对应的对象属性。如果不存在,就创建一个新的属性,并将数组元素赋值给它。如果存在,就将数组元素追加到已有的属性中。最后,返回累积的对象作为下一次迭代的初始值。

下面是一个示例代码:

// 用户信息数组
const users = [
{ id: 1, name: "Alice", age: 25 },
{ id: 2, name: "Bob", age: 30 },
{ id: 3, name: "Charlie", age: 35 },
];

// 用户订单数组
const orders = [
{ id: 1, userId: 2, product: "Book", price: 10 },
{ id: 2, userId: 1, product: "Pen", price: 5 },
{ id: 3, userId: 3, product: "Shirt", price: 20 },
{ id: 4, userId: 2, product: "Shoes", price: 15 },
];

// 使用reduce方法将两个数组合并为一个对象
const result = users.reduce((acc, user) => {
// 判断是否已经存在对应用户ID的属性
if (!acc[user.id]) {
  // 如果不存在,创建一个新的属性,并将用户信息赋值给它
  acc[user.id] = user;
  // 同时,创建一个空数组用来存储用户订单
  acc[user.id].orders = [];
}
// 遍历订单数组,找到属于当前用户的订单
for (let order of orders) {
  if (order.userId === user.id) {
    // 将订单追加到用户订单数组中
    acc[user.id].orders.push(order);
  }
}
// 返回累积的对象
return acc;
}, {}); // 初始值为空对象

// 打印结果
console.log(result);

/*
{
    "1": {
        "id": 1,
        "name": "Alice",
        "age": 25,
        "orders": [
            {
                "id": 2,
                "userId": 1,
                "product": "Pen",
                "price": 5
            }
        ]
    },
    "2": {
        "id": 2,
        "name": "Bob",
        "age": 30,
        "orders": [
            {
                "id": 1,
                "userId": 2,
                "product": "Book",
                "price": 10
            },
            {
                "id": 4,
                "userId": 2,
                "product": "Shoes",
                "price": 15
            }
        ]
    },
    "3": {
        "id": 3,
        "name": "Charlie",
        "age": 35,
        "orders": [
            {
                "id": 3,
                "userId": 3,
                "product": "Shirt",
                "price": 20
            }
        ]
    }
}
*/

9、将字符串转化为对象

我们经常会遇到在url上进行取值,当然这有很多种方法,我们用reduce方法来实现。

// 将URL参数转化为对象
let url = "https://www.example.com?name=Tom&age=20&gender=male";
let params = url.split("?")[1]; // 获取参数部分
let obj = params.split("&").reduce((acc, cur) => {
  let [key, value] = cur.split("="); // 分割键和值
  acc[key] = value; // 将键和值添加到对象中
  return acc;
}, {}); // 初始值为空对象
console.log(obj); // {name: "Tom", age: "20", gender: "male"}

10、检查字符串是不是回文字符

如果我们想要检查一个字符串是否是回文字符串,即正着读和反着读都一样,例如"racecar",我们可以使用reduce方法来实现。

首先,我们将字符串转换为数组,然后使用reduce方法从右到左遍历数组,将每个元素拼接到累积器上,得到一个反转后的字符串。然后,我们将反转后的字符串和原始字符串进行比较,如果相等,则说明是回文字符串,否则不是。

例如,给定字符串"racecar",我们可以这样写:

const isPalindrome = str => {
  // 将字符串转换为数组
  const arr = str.split('');
  // 使用reduce方法从右到左遍历数组,将每个元素拼接到累积器上
  const reversedStr = arr.reduce((accumulator, currentValue) => currentValue + accumulator, '');
  // 将反转后的字符串和原始字符串进行比较
  return reversedStr === str;
};

console.log(isPalindrome('racecar')); // true
console.log(isPalindrome('hello')); // false

当然还有其他写法:

const fun = str => {
    let result = str.split('').reverse().toString().replaceAll(',','')
    return result === str
}
console.log(fun('abcd'))    // false
console.log(fun('abba'))    // true

 


 

标签:acc,const,name,reduce,JS,举例,数组,id
From: https://www.cnblogs.com/L-hailong/p/17637128.html

相关文章

  • [18章]Vue3+NestJS 全栈开发企业级管理后台
    点击下载:[18章]Vue3+NestJS全栈开发企业级管理后台提取码:zzbv Next.js是一个用于构建现代化React应用程序的框架。它强调性能、开发体验和SEO优化,是许多React开发者的首选。Next.js提供了许多功能,包括:服务器渲染:Next.js允许在服务器端渲染React应用程序,从而提高了应......
  • js三目运算符使用及嵌套
    三目运算符基础格式:条件?a:b;下面根据一个实例来解释用法 vara=10;varb=5;varc=a>b?a:b;//定义一个c,如果a>b,那么取冒号前面的值(这里为a),如果a<=b,那么取冒号后面的值(这里为b)console.log(c);作用:三目运算符可以简化代码量,使代码清晰易懂......
  • formDataToJSON 抽丝剥茧 formData 与 Object 的转换【玩转源码】
    前言通过axios源码阅读,实现formDataToJSON抽丝剥茧formData与Object的转换,接下来详细分享整个过程。formDataToJSON抽丝剥茧formData与Object的转换FormData对象FormData对象用以将数据编译成键值对,以便用XMLHttpRequest来发送数据。FormData对象主要用于发送表单数......
  • js 关于dom
    可编辑的div//加上contenteditable="true"即可,需要注意的是内部添加的子元素默认也可编辑<divcontenteditable="true"class="edit"></div><script>vardiv=document.querySelector(".edit");//创建一个MutationObserver实例varobserver......
  • web杂记(6)-js(2)
    目录assignassign>>letx={a:11,b:22};>>lety={b:33,c:44};>>letz={};>>Object.assign(z,x,y);>>zObject{a:11,b:33,c:44}>>z.toString()"[objectObject]">>z["toString"]=()=>{retur......
  • .NET Core读取配置文件 配置文件可以是JSON、XML或INI等格式,需要添加 Microsoft.Exten
    .NETCore读取配置文件配置文件可以是JSON、XML或INI等格式需要添加Microsoft.Extensions.Configuration扩展包原文链接:https://pythonjishu.com/qipsfiygesyrqfi/下面是“.NETCore读取配置文件”的完整攻略:1.创建配置文件首先,我们需要在项目中创建一个配置文件,以便存......
  • json和yaml语法转换
    yaml格式vim0224.yaml-"0224":老师:于超学生们:-黄彦:-年龄:23地址:深圳陈亮亮:-年龄:24地址:广州罗兴林:-年龄:24地址:贵州字典的形式:"key":"value",转化为json类型去看,{"key":value},大括号{}保存字典纯变......
  • python 运行 execjs 出现错误 UnicodeEncodeError: 'gbk' codec can't encode charac
    异常解读该异常的格式一般为:UnicodeEncodeError: 'gbk'codeccan'tencodecharacter'\xfe'inpositio该异常出现的场景为在Windows电脑下使用Pythonexecjs运行指定的JS文件,但JS文件中包含中文。异常解决方案该问题解决需要修改你电脑Python安装目录下 lib......
  • 记录--JS 的垃圾回收机制
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助前言垃圾回收(GarbageCollection)是一种内存管理机制,用于检测和清理不再被程序使用的内存,这些不再被使用的内存就被称为垃圾。垃圾回收器会在JS引擎(浏览器或者nodejs)内部周期性地运行,一般情况下无需开发者手动......
  • 360浏览器上的对js支持的一些特别的问题
    在做web项目时候,基本测试了IE,火狐,chrome,基本就觉得差不多了。但是国内的用户,经常反而使用搜狗,360之类的伪浏览器,因为他们都稀里糊涂的被捆绑了。这里要说的是,在其他浏览器很兼容的东西,但是到360这边就出问题了。2个表格显示的例子。例1:jq('#classManageTable').append(data);这个......