아래 나열된 7개의 메서드는 원본 배열을 변형시키는데, 이를 side effect(부수효과) 라고 한다. 이런 side effect를 갖는 함수(or 메서드)는 코드의 복잡도와 버그 발생확률을 높이는 원인 중 하나다. 그렇기 때문에 아래 메서드를 사용하기 보다 다음에 2. 변형 배열를 반환하는 메서드에서 소개하는 메서드를 사용을 우선시 하자~!
let arr = [1,2,3,4,5]
arr.push(0) // [1, 2, 3, 4, 5, 0] 변형된 배열의 length 리턴, 맨 뒤에 요소 추가
arr.pop() // [ 1, 2, 3, 4 ] 제거한 요소 리턴, 맨 뒤 요소 제거
arr.shift() // [ 2, 3, 4, 5 ] 제거한 요소 리턴 , 맨 앞 요소 제거 //
arr.unshift(9) // 6 ,[ 9, 1, 2, 3, 4, 5 ] 변형된 배열의 length 리턴, 맨앞에 요소 추가
arr.splice(0); // 변경된 배열 리턴 [ 1, 2, 3, 4, 5 ]
arr.splice(1);
arr.splice(4); // 잘라낸 값 리턴 [ 5 ], 결과는 남은 배열
let arr2 = [22,1,555,11,4,33]
arr2.sort() // 각 값을 문자열로 변형한뒤 사전순으로 정렬, 변형된 배열을 리턴 [ 1, 11, 22, 33, 4, 555 ]
arr2.reverse() // 변형된 배열을 리턴, [ 33, 4, 11, 555, 1, 22 ]
push()
: 추가pop()
: 제거shift()
: 제거unshift()
: 추가sort()
: 정렬값을 문자열로 변형한뒤 사전순으로 정렬한다. 인자로 compareFunction을 넘기면 해당 함수에 따라 정렬된다.
const orderNum1 = arr => {
arr.sort((left, right)=>{
if (left < right) {
return -1;
}
if (left > right) {
return 1;
}
// a must be equal to b
return 0;
})
}
const orderNum1 = arr => {
arr.sort((left, right)=>{
if (left < right) {
return 1;
}
if (left > right) {
return -1;
}
// a must be equal to b
return 0;
})
}
reverse()
: 뒤집기splice(start, range)
: 잘라내기잘라낼 배열의 인덱스를 인자로 지정
원본 배열을 변형하지 않고 새로운 배열을 반환하는 메서드를 배열접근 메서드라 부른다.
concat()
원본배열을 복제한뒤 인자로 받은 값을 배열 맨뒤에 추가하여 새로운 결과 리턴, 여러개의 인자를 받을 수 있다.
const originArr = [2,22]
// push() 대체하기
const newArr = originArr.concat(3,[4,44])
console.log({originArr, newArr})
// { originArr: [ 2, 22 ], newArr: [ 2, 22, 3, 4, 44 ] }
// unshift() 대체하기
const newArr2 = (['a']).concat(originArr);
console.log(newArr2) // [ 'a', 2, 22 ]
[4,44]
)이 입력되면, 배열에 속한 각각의 값이 1개의 인덱스(newArr: [ 2, 22, 3, 4, 44 ]
)로 합쳐진다!push()
, unshift()
를 대체할 수 있다slice(start,end)
splice()
와 매개변수의 사용이 다름.
const arr = ['a','b','c','d']
const newArr1 = arr.slice(1)
const newArr2 = arr.slice(1,2)
const newArr3 = arr.slice(1,3)
console.log({newArr1,newArr2,newArr3})
// {
// newArr1: [ 'b', 'c', 'd' ],
// newArr2: [ 'b' ],
// newArr3: [ 'b', 'c' ]
// }
map(CB)
CB
에는 3개의 매개변수가 오는데 첫번째 매개변수는 배열순회 각 값, 두번째 매개변수는 해당 값의 index, 세번째 매개변수는 원본 배열이 위치함.
const arr = ['apple','banana','citron']
const newArr = arr.map((currentValue, currentIndex, originArray)=>{
// 여기에 할 것 ~
console.log(currentValue,currentIndex)
// 'apple', 0
// 'banana', 1
// 'citron', 2
return currentValue.length > 5 ? currentValue : false
})
console.log(newArr) // [ false, 'banana', 'citron' ]
filter(CB)
CB
는 map()
메서드와 동일하다. 조건을 걸어 해당 조건이 참일때 값만 모은 배열을 리턴한다.
const arr = ['apple','banana','citron']
const newArr = arr.filter((currentValue, currentIndex)=>{
// 여기에 할 것 ~
return currentValue.length > 5
})
console.log(newArr) // [ 'banana', 'citron' ]
reduce(CB,초기값)
reduce()
의 CB
는 map()
, filter()
와는 조금 다르다.
arr.reduce((acc,currentValue,currentIndex,originArray)=>{
console.log('리듀스',{acc,currentValue,currentIndex,originArray})
},'')
// '리듀스' {
// acc: '',
// currentValue: 'a',
// currentIndex: 0,
// originArray: [ 'a', 'b', 'c', 'd' ]
// }
// '리듀스' {
// acc: undefined,
// currentValue: 'b',
// currentIndex: 1,
// originArray: [ 'a', 'b', 'c', 'd' ]
// }
// '리듀스' {
// acc: undefined,
// currentValue: 'c',
// currentIndex: 2,
// originArray: [ 'a', 'b', 'c', 'd' ]
// }
// '리듀스' {
// acc: undefined,
// currentValue: 'd',
// currentIndex: 3,
// originArray: [ 'a', 'b', 'c', 'd' ]
// }
reduce()
를 사용하다보면 누산기 acc
의 값을 직접적으로 변형하기도 하고, 객체 불변성을 유지하며 새로운 값을 리턴할수 도 있다. 객체 불변성을 유지하는 방식으로 작성하는 것이 side effect를 만들지 않고, 코드의 복잡도와 버그 발생확률을 낮칠수 있다.
const reducer = arr => arr
.reduce((acc, curr) => {
const { key, value } = curr;
// acc를 직접 변형하는 방식
acc[key] = value;
return acc
// acc를 변형하지 않고 새로운 객체 리턴하는 방식
return {
...acc,
[key]: value,
}
}, {});
forEach()
forEach()
메서드는 원본 배열을 수정하지 않고 순회만 하며, 새로운 배열이 아닌 undefined
리턴한다. for문을 간편하게 쓰는 메서드!
undefined
변형 배열를 반환하는 메서드는 메서드 체이닝을 할 수 있다~~
const arr = [1,10,100,200,300]
const result = arr
.filter(data => data > 100)
.map(data=>data.toString())
console.log(result) // [ '200', '300' ]