使用 reduce 求和使用场景,必学!

 1、计算数组的单个值: 您可以使用 reduce 方法基于数组元素计算单个值。例如,您可以计算数组中所有数字的总和或连接字符串。

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

 2、转换数据结构: reduce 可用于将数组转换为不同的数据结构,例如对象或嵌套数组。

const data = [
  { id: 1, name: 'Alice' },
  { id: 2, name: 'Bob' },
  { id: 3, name: 'Charlie' }
];

const idMap = data.reduce((acc, obj) => {
  acc[obj.id] = obj.name;
  return acc;
}, {});

console.log(idMap);
// 输出:
// {
//   1: 'Alice',
//   2: 'Bob',
//   3: 'Charlie'
// }

3、展平数组: 您可以使用 reduce 将具有嵌套数组的数组展平为单层数组。

const nestedArray = [[1, 2], [3, 4], [5, 6]];
const flattenedArray = nestedArray.reduce((acc, current) => acc.concat(current), []);

console.log(flattenedArray); // 输出: [1, 2, 3, 4, 5, 6]

 4、数据分组: reduce 可用于根据键或条件对数组中的元素进行分组。

const data = [
  { id: 1, category: 'A' },
  { id: 2, category: 'B' },
  { id: 3, category: 'A' },
  { id: 4, category: 'B' }
];

const groupedData = data.reduce((acc, obj) => {
  acc[obj.category] = acc[obj.category] || [];
  acc[obj.category].push(obj);
  return acc;
}, {});

console.log(groupedData);
// 输出:
// {
//   A: [{ id: 1, category: 'A' }, { id: 3, category: 'A' }],
//   B: [{ id: 2, category: 'B' }, { id: 4, category: 'B' }]
// }

5、去重: 您可以使用 reduce 来从数组中去除重复项。 

const numbers = [1, 2, 2, 3, 4, 4, 5];
const uniqueNumbers = numbers.reduce((acc, current) => {
  if (!acc.includes(current)) {
    acc.push(current);
  }
  return acc;
}, []);

console.log(uniqueNumbers); // 输出: [1, 2, 3, 4, 5]

6、 项目实战


const data = [
  {
    "index": 1,
    "name1": "英国",
    "name2": "邮编开头",
    "name3": "KW15-17/PA34/PA60-61/PA76-78/PH42-44/ZE",
    "name4": "39.5",
    "name5": "37.5",
    "name6": "37.5",
    "name7": "37.5"
  },
  {
    "index": 2,
    "name1": "意大利/西班牙/匈牙利/罗马尼亚",
    "name2": "完整邮编+",
    "name3": "45031,45020,100141",
    "name4": "19.8",
    "name5": "16.8",
    "name6": "14.8",
    "name7": "14.8"
  },
  {
    "index": 3,
    "name1": "法国",
    "name2": "国家",
    "name3": "",
    "name4": "9.6",
    "name5": "9.6",
    "name6": "9.6",
    "name7": "9.5"
  },
  {
    "index": 5,
    "name1": "奥地利/瑞典/丹麦/希腊/葡萄牙/立陶宛/卢森堡",
    "name2": "完整邮编+",
    "name3": "45770,80440,91225,60452,59353"
    "name4": "20.1",
    "name5": "20.2",
    "name6": "65.2",
    "name7": "96.2"
  }
];

 现在需要这样处理数据
 1、如果对象中存在name2为完整邮编+,那么把这个对象拷贝一份 然后删除这个对象
 2、再然后在这个删除的位置需要插入2个对象    name1 通过/分割  
    对象一为刚才拷贝的数据,但是对象中的name1为分割的第一项  name2 为'完整邮编' 
    对象二为刚才拷贝的数据,但是对象中的name1为分割的第二项  name2 为'国家' 

  // 处理 分区类型  等于完整邮编+ 情况
  const processedData = tableData2.reduce((acc, obj) => {
    if (obj.name2 === '完整邮编+') {
      const copy1 = { ...obj, name1: obj.name1.split('/')[0], name2: '完整邮编' }
      const copy2 = { ...obj, name1: obj.name1.split('/')[1], name2: '国家', name3: '' }
      acc.push(copy1, copy2)
    } else {
      acc.push(obj)
    }
    return acc
  }, [])
  const resetIndexedData = processedData.map((obj, index) => ({ 
    ...obj, index: index + 1 
  }))

  console.log('预览resetIndexedData==>>', resetIndexedData)

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值