<4. 배열의 함수형 메소드>
* for vs forEach
var data = [{title : "hello",content : "간지철철", price : 12000},
{title : "crong",content : "괜춘한 상품", price : 5500},
{title : "codesquad",content : "쩌는상품", price : 1200}];
- for문과 forEach를 사용하기
for(var i=0; i<data.length; i++) {
console.log(data[i].title , data[i].price)
}
data.forEach(function(v) {
console.log(v.title, v.price);
});
forEach에서는 더 이상 i++이나 length를 판단하는 코드가 필요 없으며 그만큼 실수를 줄일 수 있고, 코드가 더 보기 좋아진다.
무조건 전체 배열을 다 도니까 더 쉽게 코드 생성이 가능하다.
ES6의 arrow함수를 사용한다면 더 간단해진다.
* map, filter
- map 메서드
함수에서 정의한 방법대로 모든 원소를 가공해서 새로운 배열을 반환한다.
==> 20% 인상되는 가격을 계산하여 새로운 배열을 만들어 준다. (원본 값은 그대로 유지된다)
이것이 map객체가 가지는 차이점! 그러므로 꼭 return을 해주어야 한다.
(위에 데이터에 따라 object가 있을 경우에는 v.price * 1.1 이런 식으로 .을 찍고 값을 지정해 주어야 함)
var filteredData = data.map(function(v) {
return v * 1.1 ; //10% 가격을 인상!
});
- filter 메서드
함수에서 정의한 조건에 맞는 원소만 추려서, 새로운 배열을 반환한다.
var filteredData = data.filter(function(v) {
return v.price > 5000; //5000원이상만 추출
});
- filter, map을 같이 써보기
숫자가 3개 이상인 데이터만, '원'이라는 단위를 붙여서 배열 데이터로 모은다
{title: "hello", content: "간지철철", price: "12,000원"} // 이런식으로 출력.
var filteredData = data.filter(function(v) {
return v.price > 5000;
}).map(function(v) {
v.price = (''+v.price).replace(/^(\d+)(\d{3})$/, "$1,$2원");
return v;
});
이 코드에서는 5,000 이상의 값을 먼저 추출하고, 그리고 정규 표현식을 사용해서 '원'표현식으로 변경한 배열을 반환했음
* 원본 데이터를 유지 - immutable
어떤 이유로 원본데이터가 변경되면, 추적도 어렵고, 어디서 어떤 이유로 변경된 것인지 좀 알기 어렵다.
또한, 때론 다시 이전 상태의 값을 되돌리고 싶을 경우도 있음. 이때 원본 데이터를 유지하려면!
var filteredData = data.filter(function(v) {
return v.price > 5000;
}).map(function(v) {
var obj = {};
obj.title = v.title;
obj.content = v.content;
obj.price = (''+v.price).replace(/^(\d+)(\d{3})$/, "$1,$2원");
return obj;
});
원래의 data값은 그대로 유지되면서 새로운 배열만 확인할 수가 있다.
참고로 이를 immutable하다고 표현한다.
filter도 새로운 배열을 만든다. map과 유사한데 if문처럼 걸러진 데이터로만 새로 생성된다는 차이점이 존재한다.
'BoostCource > Front-end' 카테고리의 다른 글
[FE] 04. bind 메소드로 this 제어하기 (0) | 2018.08.05 |
---|---|
[FE] 04. 객체 리터럴과 this (0) | 2018.08.05 |
[FE] 03. Tab UI (0) | 2018.07.28 |
[FE] 03. HTML templating (0) | 2018.07.28 |
[FE] 03. Event delegation (이벤트 버블링) (0) | 2018.07.28 |