Skip to content
Go back

JavaScript Array.reduce 实用技巧

Edit page

Table of contents

Open Table of contents

reduce api

array.reduce(function(accumulator, currentValue, index, array), initialValue);

reduce 函数接收4个参数:

reducer 函数的返回值分配给累计器,该返回值在数组的每个迭代中被记住,并最后成为最终的单个结果值。

应用

数组求和

// const arr = [12, 34, 23];
// const sum = arr.reduce((acc, cur) => acc + cur);
// const sum = arr.reduce((acc, cur) => acc + cur, 10);
var result = [
  { subject: "math", score: 88 },
  { subject: "chinese", score: 95 },
  { subject: "english", score: 80 },
];
// const sum = result.reduce((accumulator, cur) => accumulator + cur.score, 0);
const sum = result.reduce(
  (accumulator, cur) => accumulator + cur.score,
  -10
);
console.log(sum);

数组最大值

// 数组最大值
const a = [12, 34, 23, 6];
const max = a.reduce((acc, cur) => (acc > cur ? acc : cur));
console.log(max);

数组转字符串

const objArr = [{ name: "老大" }, { name: "老二" }, { name: "老三" }];
const res = objArr.reduce((acc, cur, index, arr) => {
  if (index === 0) {
    return cur.name;
  } else if (index === arr.length - 1) {
    return acc + "" + cur.name;
  } else {
    return acc + "" + cur.name;
  }
}, "");
console.log(res);

求字符串中字母出现的次数

const str = "sfhjasfjgfasjuwqrqadqeiqsajsdaiwqdaklldflas-cmxzmnha";
const res1 = str.split("").reduce((acc, cur) => {
  acc[cur] ? acc[cur]++ : (acc[cur] = 1);
  return acc;
}, {});
console.log(res1);

数组转数组

var arr1 = [2, 3, 4, 5, 6]; // 每个值的平方
const res2 = arr1.reduce((acc, cur) => {
  acc.push(cur * cur);
  return acc;
}, []);
console.log(res2);

数组转对象

var streams = [
  { name: "技术", id: 1 },
  { name: "设计", id: 2 },
];

var obj = streams.reduce((acc, cur) => {
  acc[cur.id] = cur;
  return acc;
}, {});
console.log(obj);

多维的叠加执行操作

var result1 = [
  { subject: "math", score: 88 },
  { subject: "chinese", score: 95 },
  { subject: "english", score: 80 },
];
var dis = {
  math: 0.5,
  chinese: 0.3,
  english: 0.2,
};

const res3 = result1.reduce((acc, cur) => dis[cur.subject] * cur.score + acc, 0)
console.log(res3);

Promise for循环

const ajax = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const randomNum = Math.random();
      console.log(randomNum);
      if (randomNum > 0.5) {
        resolve(true);
      } else {
        resolve(false);
      }
    }, 1000);
  });
};
const list = [1, 2]

list.reduce(async(previousValue, currentValue) => {
  await previousValue
  return ajax(currentValue)
}, Promise.resolve())

//不用await
list.reduce((previousValue, currentValue) => {
   return previousValue.then(() => ajax(currentValue));
}, Promise.resolve());

async function runPromiseByQueue() {
  //使用await 同步执行promise
  for (let value of list) {
    await ajax();
  }
}
runPromiseByQueue()

for (let value of list) {
  // 不使用await,异步执行promise
  ajax();
}

按属性分组

let obj = [
  {name: 'Alice', job: 'Data Analyst', country: 'AU'},
  {name: 'Bob', job: 'Pilot', country: 'US'},
  {name: 'Lewis', job: 'Pilot', country: 'US'},
  {name: 'Karen', job: 'Software Eng', country: 'CA'},
  {name: 'Jona', job: 'Painter', country: 'CA'},
  {name: 'Jeremy', job: 'Artist', country: 'SP'},
]
let ppl = obj.reduce((group, curP) => {
  let newkey = curP['country']
  if(!group[newkey]){
    group[newkey]=[]
  }
  group[newkey].push(curP)
  return group
}, [])

Edit page
Share this post on:

Previous Post
Git 常用操作命令大全