map 은 배열의 모든것 1탄 에서 다루었으니, 다른 것들도 다뤄보도록 한다.
ㆍfilter
말 그대로 배열에서 어떤 값을 필터링 하고 싶을 때 사용한다.
filter 내부 에서 리턴되는 값이 true 이면 해당 원소를 포함하고,
false 이면 포함하지 않는다.
const data = [1, 2, 3, 4, 5]
// 들어온 val 가 짝수인 경우에 true.
// true 이면 새로운 배열에 포함하고, false 이면 제외한다.
// 짝수를 얻어와 보자.
const evenNumber = data.filter(val => (val % 2 == 0 ) );
ㆍEvery, Some
배열 값들 모두(Every) 그러한가, 몇개(Some)만 그러한가.
당연히 도중에 답을 찾으면 순회를 그만둔다.
const data = [1, 2, 3, 4, 5];
const isAllEven = data.every(val => { return val % 2 == 0 });
console.log(isAllEven); // false
const isSomeEven = data.some(val => { return val % 2 == 0 });
console.log(isSomeEven); // true
ㆍReduce
사실 map 과 filter 를 이용하면 거의 모든 작업을 다 할 수 있을 것 같은 생각이 든다.
하지만 다음과 같이 배열에서 특정 단어의 개수를 세서
새로운 Object 를 만들고 싶을 때 등 복잡한 작업에는 reduce 가 딱이다.
movie = ["spy","oabe","oabe","ray","spy","room","room","once","ray","spy","once"];
var result = movie.reduce( (obj, value, index, array)=> {
if(obj.hasOwnProperty(value)) {
obj[value] += 1;
} else {
obj[value] = 1;
}
return obj;
}, {});
{ spy : 3,
oabe : 2,
ray : 2,
room : 2,
once : 2 }
만약에 관리를 jsonArray 로 하고싶다면, 다음과 같은 방법을 사용해도 된다.
var movie = ["spy","oabe","oabe","ray","spy","room","room","once","ray","spy","once"];
var idxHash = {};
var result = movie.reduce( (arr, value, index, array)=> {
if(idxHash.hasOwnProperty(value)) {
arr[idxHash[value]].count += 1;
} else {
idxHash[value] = arr.length;
arr.push({title:value, count:1});
}
return arr;
}, []);
[ {title: spy , count: 3}
,{title: oabe, count: 2}
,{title: ray , count: 2}
,{title: room, count: 2}
,{title: once, count: 2}]
눈치 챘겠지만 최초 초기화 타입은 json, array 등 다양하게 줄 수 있고,
초기화 값도 줄 수 있다.
결국 배열을 순회하면서 여기에 값을 채워나가는 형태다.