JS es6 Array Methods Tips 코드 리팩토링하기
💡

JS es6 Array Methods Tips 코드 리팩토링하기

Tags
javascript
Property
Published
Jul 19, 2021
slug
js-es6-tip1

filter

배열에서 오브젝트 필터링하기
 
filter가 없다면 아래처럼 작성해야 할 것이다.
const users = [
  { name: 'George', gender: 'male' },
  { name: 'Georgia', gender: 'female' }
];
const femaleUsers = [];
for (let i = 0; i < users.length; i++) {
  if (users[i].gender === 'female') {
    femaleUsers.push(users[i]);
  }
}
 

방법1. gender가 female인 배열 필터링하기

const users = [
  { name: 'George', gender: 'male' },
  { name: 'Georgia', gender: 'female' }
];
const findFemales = function({ gender }) {
  return gender === 'female';
};
const femaleUsers = users.filter(findFemales);
여기서 콜백은 3가지 파라미터를 받는다.
  1. The current element of the array (required)
  1. The index of the current element in the array
  1. The entire array
 

방법2. arrow function으로 작성한 심플한 버전 (⭐️추천)

const users = [
  { name: 'George', gender: 'male' },
  { name: 'Georgia', gender: 'female' }
];
const findFemales = ({ gender }) => gender === 'female';
const femaleUsers = users.filter(findFemales);
 

방법3. 바로 조건 정의해서 필터링

const users = [
  { name: 'George', gender: 'male' },
  { name: 'Georgia', gender: 'female' }
];
const femaleUsers = users.filter(
   ({ gender }) => gender === 'female'
);
 

map

많은 배열 데이터를 조작할 때 유용한 map
 
맵이 없다면 아래처럼 작성해야 할 것이다.
const response = [
  { name: 'George', gender: 'male' },
  { name: 'Georgia', gender: 'female' }
];
const users = [];
for (let i = 0; i < response.length; i++) {
  users.push({
    fullname: response[i].name,
    gender: response[i].gender === 'male' ? 'M' : 'F'
  });
}
 
여기서 콜백은 3가지 파라미터를 받는다.
  1. The current element of the array (required)
  1. The index of the current element in the array
  1. The entire array
 

결과, 새로운 형태의 배열을 생성할때 유용하다.

const response = [
  { name: 'George', gender: 'male' },
  { name: 'Georgia', gender: 'female' }
];
const transformResponse = ({ name, gender }) => {
  return {
    fullname: name,
    gender: gender === 'male' ? 'M' : 'F'
  }
};
const users = response.map(transformResponse);
 

Reduce

어떤 값들의 합계를 구해야할 때 유용하다.
 
reduce가 없다면 아래처럼 작성해야 한다.
const numbers = [1,2,3,4,5,6,7,8,9];
let summary = 0;
for (let i = 0; i < numbers.length; i++) {
  summary += numbers[i];
}
 
reduce는 콜백으로 4개의 파라미터를 받는다.
  1. The accumulated value previously returned (required)
  1. The current element of the array (required)
  1. The index of the current element in the array
  1. The entire array
 
두번째 매개변수는 초기값이다. 없을 경우 배열의 첫번째 요소가 누산기의 초긱밧으로 사용되며 루프는 배열의 두번째 항목에서 시작된다.
 

reduce 사용 코드

초기값 없을때
const numbers = [1,2,3,4,5,6,7,8,9];
const addNumber = (acc, number) => {
  return acc + number;
}
const summary = numbers.reduce(addNumber);
초기값 있을때
const users = [
  { name: 'George', gender: 'male' },
  { name: 'Georgia', gender: 'female' }
];
const reduceFemaleCount = (acc, user) => {
  if (user.gender === 'female') {
    return acc + 1;
  }
  return acc;
};
const femaleUsersCount = users.reduce(reduceFemaleCount, 0);
리팩토링1. 디스트럭처링 활용하기 user.gender{ gender }
const users = [
  { name: 'George', gender: 'male' },
  { name: 'Georgia', gender: 'female' }
];
const reduceFemaleCount = (acc, { gender }) => {
  if (gender === 'female') {
    return acc + 1;
  }
  return acc;
};
const femaleUsersCount = users.reduce(reduceFemaleCount, 0);
리팩토링2. 삼항연산자로 코드 정리하기
const users = [
  { name: 'George', gender: 'male' },
  { name: 'Georgia', gender: 'female' }
];
const reduceFemaleCount = (acc, { gender }) => {
  return gender === 'female' ? acc + 1 : acc;
};
const femaleUsersCount = users.reduce(reduceFemaleCount, 0);
 

find

배열에서 value 값이 일치하는 값 찾기
const users = [
  { id: 123, name: 'George' },
  { id: 456, name: 'Georgia' }
];
const findUser = ({ id }) => id === 123; 
const user = users.find(findUser);
 

findIndex

해당 값의 index 받아오기
 
const users = [
  { id: 123, name: 'George' },
  { id: 456, name: 'Georgia' }
];
const findUserIndex = ({ id }) => id === 123;
const userIndex = users.findIndex(findUserIndex);
 

includes

예전 방법 indexOf
const numbers = [1,2,3,4,5,6,7,8,9];
const indexOf9 = numbers.indexOf(9);
if (indexOf9 !== -1) {
  console.log('9 exist');
} else {
  console.log('9 does not exist');
}
 
includes 사용하기
const numbers = [1,2,3,4,5,6,7,8,9];
if (numbers.includes(9)) {
  console.log('9 exist');
} else {
  console.log('9 does not exist');
}
 

some

특정 조건을 만족하는지 찾기
const users = [
  { name: 'George', gender: 'male' },
  { name: 'Georgia', gender: 'female' }
];
const isMale = ({ gender }) => gender === 'male';
const hasMaleUsers = users.some(isMale);
 

every

전체 조건을 만족하는지 찾기
const users = [
  { name: 'George', gender: 'male' },
  { name: 'Georgia', gender: 'female' }
];
const isFemale = ({ gender }) => gender === 'female';
const allFemales = users.every(isFemale);
 

flat

불규칙적인 배열 하나로 만들기
const numbers = [1,2,3,[4,5],[[6,7]]];

console.log(numbers.flat());  // [1,2,3,4,5,[6,7]]
console.log(numbers.flat(1)); // [1,2,3,4,5,[6,7]]
console.log(numbers.flat(2)); // [1,2,3,4,5,6,7]
 

Refernce