안녕하세요.
자바스크립트 라이브러리인 언더스코어에 다한 포스트를 하려고 합니다.
매우 작은 용량과 간단한 사용이 장점이며
자바스크립트로 array []나 object {}를 다룰때 필수적으로 필요한 라이브러리입니다.
약 100여가지의 함수가 있지만 ES5, ES6를 거치면서 안쓰게 되는 함수도 있고 (ES5, ES6의 내장함수가 더 빠르기 떄문)
쓰임이 겹치는 경우도 있습니다.
문장 몇개와 예제 하나면 이해가 되는 함수들이 있는 반면에 난해한 함수도 있습니다.
활용도가 높은 함수 위주로 설명하겠습니다.
테스트를 진행할 샘플 데이터 입니다.
var data = [
{
"productName": "Change Gout",
"mf_compony": "Jam3",
"mf_country": "Canada",
"date": "July 21, 2017",
"brand": "SOTD",
"listOfIndex": [
'가',
'나',
'다',
'라'
],
"productNumber": "23"
},
{
"productName": "underscore sss",
"mf_compony": "ms",
"mf_country": "america",
"date": "July 21, 2017",
"brand": "SOTD",
"listOfIndex": [
1,
'',
3,
'아'
],
"productNumber": "60"
},
{
"productName": "javascript ddd",
"mf_compony": "google",
"mf_country": "korea",
"date": "July 21, 2017",
"brand": "samsung",
"listOfIndex": [
'자',
0,
'타',
'카'
],
"productNumber": "55"
}
];
1. _.each
역시 제일 많이 쓰이는 건 each인데요,
ES5의 forEach가 더 빠른 성능을 내지만 _.each는 두세번째 인자로 인덱스와 전체 데이터를 넘겨주기 때문에 사용하기 편합니다.
또한 underscore의 each는 array[]와 object{}를 모두 사용할 수 있어 좋습니다.
_.each(data, function (each_data, index, all_data) {
//실행구간
});
//실행구간은 data.length 만큼 반복되며
콜백함수 내에서는 all_data로 data에 접근할 수 있습니다.
data로 바로 접근해도 되지만 변수 유지에 혼란을 주기도하고, 특히 크롬 개발자 도구에서 해당함수를 벗어나면
변수접근이 안되기 때문에 ( 실제로는 동작하지만 ) 사용하기도 합니다.
each_data[0]를 로그로 찍어보면 이렇게 나오게 되겠네요.
{
"productName": "Change Gout",
"mf_compony": "Jam3",
"mf_country": "Canada",
"date": "July 21, 2017",
"brand": "SOTD",
"listOfIndex": [
'가',
'나',
'다',
'라'
],
"productNumber": "23"
}
※ _.each를 살펴봤으니 이를 활용하여 context와 this에 대해 알아보겠습니다.
var basicArray = [1, 2, 3];
var newArray = [5, 6, 7];
_.each(basicArray, function (item) {
console.log(item);
console.log(this);
}, newArray);
위의 상황에서 console.log(item); 은 1, 2, 3 이 차례로 나올 것입니다.
저기서 this는 무엇일까요?
바로 newArray인 [5, 6, 7]입니다.
이 구성은 목표 객체를 기준삼아 반복문을 돌고 있다 하더라도
제 3의 데이터를 활용할수 있다는데에 가치가 있습니다.
2. _.find
배열이나 객체를 첫번째 파라미터로 받고, 두번째로 받는 파라미터는 배열의 요소나 객체의 프로퍼티 값을 받아
boolean값을 반환합니다.
_.each 함수는 작동되면서 자체적으로 목적달성 후 빠져나올 수 없는데
_,find 함수는 원하는 것을 찾으면 멈출 수 있는 장점이 있습니다.
_.find(data[0].listOfIndex, function (result) {
return typeof(result) === 'string';
});
data[0].listOfIndex 를 기준 데이터로 사용하고,
return을 활용해 조건식에 부합하면 반환하고 끝납니다.
3. _.countBy
반복문을 돌면서 결과물을 분류해낼 수 있습니다.
_.countBy(data[1].listOfIndex, function (result) {
return typeof(result) === 'string' ? 'string' : 'number';
});
위 코드를 실행한다면
이런 식으로 조건에 맞는 갯수를 세어줍니다.
4. _.reduce
독특한 기능을 하고 있어서 소개해드립니다만
reduce라는 이름의 의미와 하는 일이 무슨 관련이 있는지 의문이 드는 함수입니다.
이 함수를 사용하게되면 배열의 값들을 누적시켜 더해줍니다.
5. _.some, _contains, _.every
얘네들은 비슷한 동작을 하는데 조금씩 다른 함수들입니다.
_.some은
이런식으로 요소에 하나라도 true로 판명되는 요소가 있다면
결과값으로 true를 반환해주는 함수입니다.
이러한 특징으로 인해 로직을 시작하기 전에
방어코드로 사용되는 함수입니다.
_.some이 자체적으로 요소를 true/false 로 판단했다면
_.contains는 특정요소를 기준으로 충족하는지 아닌지를 판단할 수 있습니다.
첫번째 인자는 찾을 장소, 두번째 인자는 찾는 목표 입니다.
이를 보면 어떤 경우에 true를 반환하는지를 이해할 수 있게됩니다.
_.contains가 하나만 만족하면 true를 반환했지만
_.every는 모두 만족해야 true를 반환합니다.
이처럼 _.every의 두번째 인자에 함수를 집어넣고
원하는 결과를 뽑아 낼 수 있습니다.
6. _.max, _.min
_.max는
이런식으로 가장 큰 productNumber 속성값을 가지고 있는 객체를 반환해줍니다.
_.min은 이와 반대로 가장 작은 productNumber 속성값을 가지고 있는 객체를 반환해줍니다.
7. _.sortBy, _.groupBy
_.sortBy는 특정 인자값으로 정렬을 해주는 함수입니다.
이런식으로 productNumber 기준으로 정렬을 해주거나 |
숫자가 아닌 문자열일 경우 알파벳 순으로 정렬해줍니다. |
|
_.groupBy는
return 값이 같은 애들끼리 묶어줍니다.
이런식으로 'brand' 값을 키값으로 하여 헤처, 묶어줍니다.
후속 포스팅에서 계속 이어나가도록 하겠습니다.
'프론트엔드' 카테고리의 다른 글
마이크로서비스 UI - 마이크로프론트엔드 (0) | 2017.09.14 |
---|---|
underscore 알아보기 (2) (0) | 2017.09.07 |
!# 해쉬뱅 알아보기 (0) | 2017.05.29 |
React vs Angular : 리액트와 앵귤러 비교 (0) | 2017.05.22 |
Node.js 기초부터 튼튼히 (2) 내장 모듈 (0) | 2017.05.11 |