일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- nqueens
- 공부
- 코드스테이츠
- JavaScript
- 자바스크립트
- vscode
- 초보
- 취업
- JS
- underbar
- 일상
- underscores
- method
- array
- 알고리즘
- DOM
- 연습
- this
- 해커톤
- 제일어려워
- 리액트
- 코딩
- 개발
- 포스기
- grpahQL
- ftech
- react
- 클라이언트
- Instantiation Patterns
- 엔퀸즈
- Today
- Total
analogcoding
Array Method - 이해하기 본문
앞에서 메소드가 어떤 기능을 하는지에 대해 앞에서 알아보았다. 이제 동작원리에 대해 알아보고 메소드 또한 내장된 하나의 함수이기에
_underscore 에 있는 것들을 직접 적어보며 복습해보려고 한다. 기존 메소드와 같은 기능을 수행하는 함수를 직접 작성해본다.
underscore = 코딩을 도와주는 자바스크립트 라이브러리로 매우 작은 용량에 여러가지의 function을 제공.
언더스코어 함수중에는 ES5, ES6를 거쳐 내장함수로 이미 지원하는 함수들이 있다.
* 주어진 객체나 배열을 collection 으로 ,
실행할 callback함수를 iterator 라고 칭한다.
_.each
each 함수에 경우 주어진 collection이 배열/객체인지에 대해 각 요소에 대해 실행할 수 있어야한다.
_.each = function(collection,iterator) {
if(Array.isArray(colletion)){
// collection이 배열인 경우 각 elements , index , collection을 불러온다.
for(let i = 0; i < colletion.length; i++){
iterator(collection[i],i,collection)
}
}
else if(typeof collection === 'object'){
// collection이 객체인 경우 각 value , key , collection을 불러온다.
for(let key in collection){
iterator(collection[key],key,collection)
}
}
}
_.filter
filter 함수는 collection의 elements가 주어진 iterator를 통과하는 것만 리턴한다.
_.filter = function(collection,iterator) {
let result = [];
// iterator를 통과한 것을 모아놓을 배열을 생성
for(let i = 0; i < collection.length; i++){
if(iterator(collection[i])){
// iterator를 통과한 것들만 result에 넣음.
result.push(collection[i])
}
}
return result;
}
_.indexOf
indexOf 함수는 collection 내에서 target으로 정해진 elements의 index를 리턴한다. 없을 경우 -1을 리턴한다.
_.indexOf = function(collection,target){
for(let i = 0; i < collection.length; i++){
if(collection[i]===target){
return i;
}
}
return -1;
}
_.map
map 함수는 collection의 요소에 iterator를 통과한 값을 새 배열로 리턴한다.
_.map = function(collection,iterator) {
let result = [];
for(let i = 0; i < collection.length; i++){
result.push(iterator(collection[i]));
}
return result;
}
_.reduce
reduce 함수는 배열의 각 요소에 대해 주어진 리듀서(reducer) 함수를 실행하고, 하나의 결과값을 반환한다. 누적값을 구할 수 있다.
_.reduce = function(collection,iterator,acc){
if(acc === undefined){
acc = collection[0];
collection = collection.slice(1);
// acc(누적값의 첫번째 즉 초기값)가 존재하지 않을 경우 collection의 첫 요소가 acc가 된다.
// 그대로 계산해버린다면 acc 와 collection[0]이 같은 값으로 두 번 들어가서 collection을 slice 해준다.
}
if(acc){
for(let i = 0; i < collection.length; i++){
acc = iterator(acc,collection[i]);
}
}
return acc;
}
_.every
every 함수는 collection의 요소가 주어진 iterator를 모두 통과할 때 true, 하나라도 통과하지 못하면 false를 리턴한다.
iterator가 없을 경우 요소 자체의 값을 Boolean으로 판별하여 리턴한다.
_.every = function(collection,iterator){
for(let i = 0; i < collection.length; i++){
if(iterator){
if(iterator(collection[i])===false){
return false;
}
}
else if(!iterator){
if(Boolean(collection[i])===false){
return false;
}
}
}
return true;
}
_.some
some 함수는 collection의 요소가 주어진 iterator를 하나라도 통과할 때 true, 전부 통과하지 못하면 false를 리턴한다.
iterator가 없을 경우 요소 자체의 값을 Boolean으로 판별하여 리턴한다.
_.some = function(collection,iterator){
for(let i = 0; i < collection.length; i++){
if(iterator){
if(iterator(collection[i])===true){
return true;
}
}
else if(!iterator){
if(Boolean(collection[i])===true){
return true;
}
}
}
return false;
}
이렇게 기존 메소드 중 자주 쓰이는 것들에 대해 직접 함수를 작성해보니 구조와 작동방식을 이해하는데 큰 도움이 되었다.
MDN 만 봤을 때 그냥 넘어가거나 이해하지 못했던 부분들 또한 많이 받아드릴 수 있었던 시간.
다음에 이번에 다루지 못한 것들도 정리해볼 예정이다.
'Study JS for me > Array Method' 카테고리의 다른 글
Array Method - 이해하기 + (0) | 2019.04.23 |
---|---|
Array Method -2 (1) | 2019.04.22 |
Array method - 1 (0) | 2019.04.21 |