📖형식
arr.reduce((prev , curr , currIdx , array)=>{
  return prev + curr
},initalValue)
1. 객체 배열에서의 값 합산
let init = 0
  let sum = [{x:1},{x:2},{x:3}].reduce((acc , cur)=>{
    return acc + cur.x 
  },init)
  console.log('---------------------');
  console.log(sum) 
2-1. 중첩 배열 펼치기
  let flat = [[0,1],[2,3],[4,5]].reduce((acc ,cur)=>{
    return [...acc ,...cur] 
  },[])
  console.log('---------------------');
  console.log(flat); 
2-2. spread operator와 초기값을 이용하여 객체로 이루어진 배열에 담긴 배열 연결하기
 let friends = [{
    name: 'Anna',
    books: ['Bible', 'Harry Potter'],
  }, {
    name: 'Bob',
    books: ['War and peace', 'Romeo and Juliet'],
  }, {
    name: 'Alice',
    books: ['The Lord of the Rings', 'The Shining'],
  }];
  
  let result = friends.reduce((acc,cur)=> {
    return [...acc , ...cur.books] 
  },['Alphabet'])
  console.log('---------------------');
  console.log(result);
3. 객체 내의 값 인스턴스 개수 세기
  let name = ['Allice','Bob','Tiff','Bruce','Bob']
  let result = name.reduce((allName , Name) => {
    if (Name in allName) {
      allName[Name] ++ 
    }
    else {
      allName[Name] = 1; 
    }
    return allName 
  },{})
  console.log('---------------------');
  console.log(result); 
  
4. 속성으로 객체 분류하기
 let people = [
    { name: 'Alice', age: 21 },
    { name: 'Max', age: 20 },
    { name: 'Jane', age: 20 }
  ];
  const groupBy = (objArr , props) => {
    return objArr.reduce((acc , obj) => {
      let key = obj[props]
      if (!acc[key]) {
        acc[key] = [] 
      }
      acc[key].push(acc)
      return acc
    },{})
  }
  console.log('---------------------');
  console.log(groupBy(people , 'age'));
  
5. 배열의 중복 항목 제거
  let arr = [1, 5, 1, 2, 3, 5, 4, 5, 3, 4, 4, 4, 4];
  
  let result = arr.sort().reduce((acc,cur) => {
    const length = acc.length
    if (length === 0 || acc[length - 1] !== cur) { 
      acc.push(cur)
    }
    return acc
  }, [])
  console.log('---------------------');
  console.log(result); 
6. 파이프 함수(함수 합성)
  const double = x => x + x;
  const tripple = x => 3 * x;
  const quadruple = x => 4 * x;
  const pipe = (...fnc) => (input) => fnc.reduce((acc, f)=>f(acc),input)
  
  console.log('---------------------');
  pipe(double,tripple,quadruple)(10) 
7. 프로미스 순차적으로 실행
function runPromiseInSequence(arr, input) {
  return arr.reduce(
    (promiseChain, currentFunction) => promiseChain.then(currentFunction),
    Promise.resolve(input)
  );
}
function p1(a) {
  return new Promise((resolve, _) => {
    resolve(a * 5);
  });
}
function p2(a) {
  return new Promise((resolve, _) => {
    resolve(a * 2);
  });
}
function f3(a) {
 return a * 3;
}
function p4(a) {
  return new Promise((resolve, _) => {
    resolve(a * 4);
  });
}
const promiseArr = [p1, p2, f3, p4];
runPromiseInSequence(promiseArr, 10)
  .then(console.log);   
Reference
MDN