Reduce 的常用写法

一、计算数组的总和

const arr = [1, 2, 3, 4, 5];
const sum = arr.reduce(
  (previousValue, currentValue, currentIndex, array) =>
    previousValue + currentValue
);
console.log(sum); // 15

二、计算数组的平均数

const arr = [1, 2, 3, 4, 5];
const average = arr.reduce(
  (previousValue, currentValue, currentIndex, array) => {
    previousValue += currentValue;
    if (currentIndex === array.length - 1) {
      return previousValue / array.length;
    } else {
      return previousValue;
    }
  }
);
console.log(average); // 3

三、求数组的最大值

const arr = [1, 2, 3, 4, 5];
const max = arr.reduce((previousValue, currentValue, currentIndex, array) =>
  Math.max(previousValue, currentValue)
);
console.log(max); // 5

// 当然还有更好用的办法
console.log(Math.max(...arr)); // 5

四、求数组的最小值

const arr = [1, 2, 3, 4, 5];
const min = arr.reduce((previousValue, currentValue, currentIndex, array) =>
  Math.min(previousValue, currentValue)
);
console.log(min); // 1

// 老规矩
console.log(Math.min(...arr)); // 1

五、数组去重

const arr = [1, 2, 3, 3, 4, 4, 5];
const uniqueArr = arr.reduce(
  (previousValue, currentValue, currentIndex, array) => {
    if (!previousValue.includes(currentValue)) {
      previousValue.push(currentValue);
    }
    return previousValue;
  },
  []
);
console.log(uniqueArr); // [ 1, 2, 3, 4, 5 ]

六、计算数组中每个元素出现的次数

const arr = [1, 2, 3, 3, 4, 4, 5];
const countMap = arr.reduce(
  (previousValue, currentValue, currentIndex, array) => {
    if (!previousValue[currentValue]) {
      previousValue[currentValue] = 1;
    } else {
      previousValue[currentValue]++;
    }
    return previousValue;
  },
  {}
);
console.log(countMap); // { '1': 1, '2': 1, '3': 2, '4': 2, '5': 1 }

七、实现数组分组

const arr = [1, 2, 3, 4, 5];
const result = arr.reduce(
  (previousValue, currentValue, currentIndex, array) => {
    if (currentValue % 2 === 0) {
      previousValue.even.push(currentValue);
    } else {
      previousValue.odd.push(currentValue);
    }
    return previousValue;
  },
  {
    even: [],
    odd: [],
  }
);
console.log(result); // { even: [ 2, 4 ], odd: [ 1, 3, 5 ] }

八、计算数组中连续递增数字的长度

const arr = [1, 2, 3, 5, 6, 7, 8, 9];
const result = arr.reduce(
  (previousValue, currentValue, currentIndex, array) => {
    if (currentIndex === 0 || currentValue !== array[currentIndex - 1] + 1) {
      previousValue.push([currentValue]);
    } else {
      previousValue[previousValue.length - 1].push(currentValue);
    }
    return previousValue;
  },
  []
);
const maxLength = result.reduce(
  (previousValue, currentValue, currentIndex, array) =>
    Math.max(previousValue, currentValue.length),
  0
);
console.log(maxLength); // 5

九、计算对象数组的属性总和

const arr = [
  {
    name: "Alice",
    age: 25,
  },
  {
    name: "Bob",
    age: 30,
  },
  {
    name: "Charlie",
    age: 35,
  },
];
const result = arr.reduce(
  (previousValue, currentValue, currentIndex, array) =>
    previousValue + currentValue.age,
  0
);
console.log(result); // 90

十、将对象数组转换为键值对对象

const arr = [
  {
    name: "Alice",
    age: 25,
  },
  {
    name: "Bob",
    age: 30,
  },
  {
    name: "Charlie",
    age: 35,
  },
];
const result = arr.reduce(
  (previousValue, currentValue, currentIndex, array) => {
    previousValue[currentValue.name] = currentValue.age;
    return previousValue;
  },
  {}
);
console.log(result); // { Alice: 25, Bob: 30, Charlie: 35 }

十一、计算数组中出现次数最多的元素

const arr = [1, 2, 3, 4, 4, 4, 5, 5, 6, 6, 6, 6];
const result = arr.reduce(
  (previousValue, currentValue, currentIndex, array) => {
    previousValue[currentValue] = (previousValue[currentValue] || 0) + 1;
    return previousValue;
  },
  {}
);
const maxCount = Math.max(...Object.values(result));
const mostFrequent = Object.keys(result)
  .filter((key) => result[key] === maxCount)
  .map(Number);
console.log(mostFrequent); // [ 6 ]

十二、实现 Promise 串行执行

const promise1 = () => Promise.resolve("one");
const promise2 = (input) => Promise.resolve(input + " two");
const promise3 = (input) => Promise.resolve(input + " three");

const promises = [promise1, promise2, promise3];
const result = promises.reduce(
  (previousValue, currentValue, currentIndex, array) =>
    previousValue.then(currentValue),
  Promise.resolve("start")
);
result.then(console.log); // one two three

十三、对象属性值求和

const obj = {
  a: 1,
  b: 2,
  c: 3,
};
const result = Object.values(obj).reduce(
  (previousValue, currentValue, currentIndex, array) =>
    previousValue + currentValue
);
console.log(result); // 6

十四、按属性对数组分组

const arr = [
  {
    id: 1,
    name: "John",
  },
  {
    id: 2,
    name: "Mary",
  },
  {
    id: 3,
    name: "Bob",
  },
  {
    id: 4,
    name: "Mary",
  },
];
const result = arr.reduce(
  (previousValue, currentValue, currentIndex, array) => {
    const key = currentValue.name;
    if (!previousValue[key]) {
      previousValue[key] = [];
    }
    previousValue[key].push(currentValue);
    return previousValue;
  },
  {}
);
console.log(result);
/**
 * {
 *  John: [ { id: 1, name: 'John' } ],
 *  Mary: [ { id: 2, name: 'Mary' }, { id: 4, name: 'Mary' } ],
 *  Bob: [ { id: 3, name: 'Bob' } ]
 * }
 */

十五、扁平化数组

const nestedArray = [
  [1, 2],
  [3, 4],
  [5, 6],
];
const flattenedArray = nestedArray.reduce(
  (previousValue, currentValue, currentIndex, array) =>
    previousValue.concat(currentValue),
  []
);
console.log(flattenedArray); // [ 1, 2, 3, 4, 5, 6 ]

十六、合并对象

const obj1 = { a: 1, b: 2 };
const obj2 = { c: 3, d: 4 };
const obj3 = { e: 5, f: 6 };
const mergedObj = [obj1, obj2, obj3].reduce(
  (previousValue, currentValue, currentIndex, array) =>
    Object.assign(previousValue, currentValue),
  {}
);
console.log(mergedObj); // { a: 1, b: 2, c: 3, d: 4, e: 5, f: 6 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值