Array.prototype.slice()
- start ~ end 직전까지에 대한 얕은 복사본으로 새로운 배열을 리턴한다.
- 원본 배열을 변경하지 않는다.
const arr = ['a', 'b', 'c', 'd', 'e'];
// slice(startIdx, endIdx)
console.log(arr.slice(2,4)); // ['c', 'd']
Array.prototype.splice()
- 시작 인덱스부터 입력된 갯수만큼 배열에서 추출한 후 원본 배열을 변경한다.
const arr = ['a', 'b', 'c', 'd', 'e'];
// splice(startIdx, deleteCount)
console.log(arr.splice(2,3)); // 이 때의 리턴 값은 ['c', 'd', 'e'];
console.log(arr); // ['a', 'b']
// 배열에 새로운 요소 추가
arr.splice(1,0,'ff');
console.log(arr); // ['a', 'ff', 'b'];
// 배열 요소 교체
arr.splice(1,1,'cc'); // 이 때의 리턴 값은 ['ff']
console.log(arr) // ['a', 'cc', 'b']
Array.prototype.reverse()
- 배열의 순서를 반전시키고, 원본 배열을 변경한다.
const arr = ['a', 'b', 'c', 'd', 'e'];
arr.reverse(); // ['e', 'd', 'c', 'b', 'a']
console.log(arr); // ['e', 'd', 'c', 'b', 'a']
Array.prototype.concat()
- 두 배열을 합치고, 합쳐진 배열을 리턴한다.
- 원본 배열을 변경하지 않는다.
const arr1 = ['a', 'b', 'c'];
const arr2 = ['d', 'e', 'f'];
// (arr or [value]).concat(arr or [value])
const arr3 = arr1.concat(arr2);
console.log(arr3) // ['a', 'b', 'c', 'd', 'e', 'f']
// 스프레드 문법으로도 같은 효과를 얻을 수 있다.
const arr4 = [...arr1, ...arr2];
console.log(arr4); // ['a', 'b', 'c', 'd', 'e', 'f']
Array.prototype.join()
- 문자열 seperator를 기준으로 각 요소를 구분해 전체 배열을 문자열로 리턴한다.
- 원본 배열을 변경하지 않는다.
const arr = ['a', 'b', 'c', 'd', 'e'];
arr.join(' '); // 'a b c d e'
console.log(arr); // ['a', 'b', 'c', 'd', 'e']
Array.prototype.at()
- at(idx) idx에 해당하는 요소를 리턴한다.
- 배열의 길이를 모르는 경우에서, 마지막 요소를 가져올 때 간편하게 쓸 수 있다.
const arr = [23, 11, 44];
// at(idx) idx에 해당하는 요소를 반환한다.
console.log(arr.at(1)); //11
// 배열의 길이를 모르는 경우에서 마지막 요소를 가져올 때 간편하게 쓸 수 있다.
console.log(arr[arr.length - 1]); //44
console.log(arr.at(-1)); //44
Array.prototype.forEach()
- forEach 메서드는 콜백함수를 필요로 하는 고차함수이다.
- forEach 메서드가 적용된 배열을 반복하며, 배열의 각 요소에 대하여 콜백함수를 실행한다. for문을 대체할 수 있으며, for문 보다 가독성이 좋다. 또한 메서드 체이닝(메서드를 연결하여 사용하는 것)으로 활용도가 높다.
- 콜백함수 실행시 배열의 현재 요소, 인덱스, 메서드가 실행중인 배열을 순서대로 인자 값으로 전달한다.
- for문과 달리 break문을 사용할 수 없다.
const arr = ['a', 'b', 'c', 'd', 'e'];
// 일반 반복문
for (const [idx, val] of arr.entries()) {
console.log(idx, val);
}
// 0 a 1 b 2 c ...
// forEach 반복문
arr.forEach((val, idx) => console.log(idx, val));
// 0 a 1 b 2 c ...
- forEach 메서드는 함수의 유효범위를 벗어나는 작업, 즉 의도적으로 부수효과를 필요로 할 때에도 사용할 수 있다. (부수효과는 의도치 않은 동작을 발생시킬 수 있으므로 주의가 필요하다.)
const people = [{'name' : 'a', 'age' : '20'}, {'name' : 'b', 'age' : '25'}];
// 요소 객체에 새로운 프로퍼티 동적 할당
people.forEach(person => person.gender = person.name === 'a' ? 'f' : 'm')
console.log(people)
// 0: {name: 'a', age: '20', gender: 'f'}
// 1: {name: 'b', age: '25', gender: 'm'}
Array.prototype.map()
- 배열 내의 모든 요소에 대해 각각 콜백함수를 실행하여, 그 결과를 모아 새로운 배열을 만든다. (원본 영향x)
- 내부의 요소를 활용해 새로운 배열을 리턴하기 때문에, 원본의 크기는 유지된다.
- forEach 메서드와 동일하게 요소, 인덱스, 배열을 순서대로 인자값으로 전달한다.
- for문을 돌아 새로운 배열에 push 하는 방식보다, 콜백함수를 활용한 함수형 프로그래밍 방식이 더 modern한 방식이라고 할 수 있다.
const nums = [1, 2, 3, 4, 5];
const newNums = nums.map(el => el * 2);
// [2, 4, 6, 8, 10]
Array.prototype.filter()
- 콜백함수의 조건을 만족하는 배열의 요소들만 '필터링' 하여 새로운 배열을 리턴한다. (원본 영향x)
const nums = [1, 2, 3, 4, 5];
const numFilter = nums.filter(num => num > 3)
// [4, 5]
Array.prototype.reduce()
- 배열의 각 요소에 대해 주어진 리듀서(reducer) 함수를 실행하고, '하나의 결과값'을 리턴한다.
const nums = [1, 2, 3, 4, 5];
// reduce 활용한 합계 계산
nums.reduce((acc, cur) => acc + cur, 0)
// 15
// reducer 함수의 리턴값은 acc이다.
nums.reduce((acc, cur) => {
acc = acc + cur;
return acc
}, 0)
// 15
// for..of 활용한 합계 계산
let sum = 0;
for(let num of nums) sum += num;
console.log(sum) // 15
- 리듀서 함수(reduce의 콜백함수)는 4개의 인자값을 갖는다.
- accumulator : 콜백의 리턴값 누적 (굴릴수록 커지는 눈사람 역할),
- currentValue : 처리할 현재 요소
- currentIndex : 현재 요소의 인덱스
- array : reduce를 호출한 배열
- + initialValue : 초기값, 콜백 최초 호출에서 첫 번째 인수(acc)를 제공하는 값. 초기값이 없을 경우 배열의 첫 번째 요소를 사용한다.
- 요소를 반복하고 accumulator 에 누산되어 리턴된다는 점에서, map,filter,forEach 등의 기능을 reduce로 구현할 수 있다.
const nums = [1, 2, 3, 4, 5];
// 최댓값찾기
const max = nums.reduce((acc, cur) => {
if (acc > cur) return acc;
else return cur;
}, nums[0]);
max // 5
Array.prototype.find()
- 배열에서 조건에 해당하는 요소를 찾아내는 메서드이다.
- filter 메서드와 동일하게 boolean 값을 리턴하는 콜백함수를 필요로 한다.
- 조건에 부합하는 가장 첫번째 요소를 리턴한다.
- 배열이나 객체에 포함된 한 가지의 요소 혹은 일부분만 알고있으면 그 전체를 찾을 수 있다.
- 만족하는 요소가 없으면 undefined 를 반환한다.
const users = [{'name' : 'Sarah', 'age' : '22'},
{'name' : 'Jessica', 'age' : '24'},
{'name' : 'Parker', 'age' : '55'}]
users.find(user => user['name'] === 'Jessica');
// {name: 'Jessica', age: '24'}
Array.prototype.findIndex()
- find와 비슷하지만, 조건에 부합하는 첫번째 요소의 '인덱스'를 반환한다.
- 만족하는 요소가 없으면 -1를 반환한다.
- indexOf와 비슷하지만, 콜백함수에서 자세한 컨디션을 정할 수 있다는 장점이 있다.
const users = [{'name' : 'Sarah', 'age' : '22'},
{'name' : 'Jessica', 'age' : '24'},
{'name' : 'Parker', 'age' : '55'}]
users.findIndex(user => user['name'] === 'Jessica');
// 1
Array.prototype.some()
- 콜백함수의 조건에 부합하는 요소가 하나라도 있으면 true를 리턴한다.
const arr = ['a', 1, 'b', 2];
arr.some(el => typeof el === 'number');
// true
Array.prototype.every()
- 콜백함수의 조건에 모든 것이 부합하면 true, 하나라도 통과하지 못하면 false를 리턴한다.
const arr = ['a', 1, 'b', 2];
arr.every(el => typeof el === 'number');
// false
- some & every 메서드는 arr.includes(v) 와 마찬가지로 일치 여부를 판단하지만, 더 세밀한 조건을 부여할 수 있다는 장점이 있다.
- 조건문에서 배열이 특정 조건을 만족하는 경우에만 무언가 실행되도록 코드를 짠다면, some과 every가 효과적일 수 있다.
Array.prototype.flat()
- 중첩된 배열의 요소를 flat 하게 하나의 배열로 리턴한다.
- 주어진 depth가 있다면 (기본값 1) 이를 이어붙여 새로운 배열을 생성한다.
const arrDeep = [[[1, 2], 3], [4, [5, 6]], 7, 8];
console.log(arrDeep.flat(2)); //[1, 2, 3, 4, 5, 6, 7, 8]
Array.prototype.flatMap()
- map 메서드와 flat이 합쳐진 메서드로, map으로 얻은 결과물에 flat을 실행한 것과 동일한 결과값을 리턴한다.
- flatMap의 경우 depth 1 레벨에서의 flat 밖에 실행하지 못하기 때문에, 더 깊은 중첩 배열에서 적용할 경우 flat과 map을 따로 사용해야 한다.
onst nums = [[1], [2], [3]];
nums.flatMap(num => num * 2)
// (3) [2, 4, 6]
nums.flatMap(num => [[num * 2]])
// [[2], [4], [6]]
Array.prototype.sort()
[JavaScript] arr.sort() 메서드 (배열의 정렬)
arr.sort([comepareFunction]) sort() 메서드를 배열에 적용하면 조건에 따른 적절한 정렬 후 배열을 리턴한다. 이 때 원본 배열을 직접 변경하기 때문에 사용시 주의가 필요하다. comepareFunction은 두 개의
friedegg556.tistory.com
Array.prototype.fill()
- arr.fill(v, srtIdx, endIdx) : strIdx ~ endIdx 만큼의 범위에 v가 포함되도록 arr을 변경한다.
- new Array 생성자와 체이닝해서 원하는 배열을 만들 수 있다.
- 새로운 배열 생성 : new Array(length) : length만큼의 빈 배열 생성
const newArr = new Array(5)
console.log(newArr) //[empty × 5]
newArr.fill(true,0,newArr.length) // [true, true, true, true, true]
Array.prototype.from()
- Array.from({length : n}, (cur, i) => 조건) 혹은 Array.from(유사 배열, (cur, i) => 조건)
- n만큼의 길이를 가진 배열을 맵핑함수의 리턴값으로 채운 새 배열을 생성한다. 이 때 length 대신 유사배열객체, 이터러블이 들어가게 되면 그 객체를 맵핑함수에 따라 배열화 할 수 있다. (ex NodeList 배열화)
- 콜백함수는 (현재 값, 인덱스)의 순서로 인자값을 받는다.
const arr2 = Array.from({ length: 7 }, () => 1);
// (7) [1, 1, 1, 1, 1, 1, 1]
const z = Array.from({ length: 7 }, (_, i) => i + 1);
// (7) [1, 2, 3, 4, 5, 6, 7]
SUMMARY : 상황별 메서드 사용 정리!!
- 원본 배열 변경 : (add) push, unshift / (remove) pop, shift, splice / (etc) reverse/ sort / fill
- 새로운 배열 생성 : map / filter / slice(일부분) / concat(합치기) / flat / flatMap
- Index 얻기 : (값 기준) indexOf / (조건 기준) findIndex
- 배열 element 얻기 : (조건 기준) find
- 포함 여부 확인 : (값 기준) includes / (조건 기준) some, every
- 새 문자열 생성 : join(seperator)
- 배열 -> 값 : reduce
- 순회 : forEach (새 배열을 생성하지 않는다.)
참고자료
https://developer.mozilla.org/ko/
MDN Web Docs
The MDN Web Docs site provides information about Open Web technologies including HTML, CSS, and APIs for both Web sites and progressive web apps.
developer.mozilla.org
https://www.udemy.com/course/the-complete-javascript-course/
Learn Modern Javascript (Build and Test Apps) - Full Course
The modern JavaScript course for everyone! Master JavaScript with projects, challenges and theory. Many courses in one!
www.udemy.com
'JavaScript > JavaScript' 카테고리의 다른 글
[JavaScript] JSON (0) | 2022.07.09 |
---|---|
[JavaScript] 객체 Object (0) | 2022.07.08 |
[JavaScript] net::ERR_ABORTED 404 (NOT FOUND) 에러 (0) | 2022.06.30 |
[JavaScript] 문자열 메서드 정리 (0) | 2022.06.27 |
[JavaScript] 데이터 타입 (0) | 2022.06.24 |