1️⃣ map
map()
함수는 배열 내의 모든 요소 각각에 대해 call back 함수를 호출한 결과를 모아 새로운 배열을 반환 합니다.
map
함수는 아래와 같은 형태의 콜백함수를 인자로 받습니다.
(value,index,arr) => {}
value는 배열의 요소를 말하고, index는 해당 요소의 인덱스, arr은 해당 map함수를 호출한 배열을 의미합니다.
const array = [1, 4, 9, 16];
const map = array.map((x) => x * 2);
console.log(map); //[2, 8, 18, 32]
const array = [1, 4, 9, 16];
const map = array.map((x) => x * 2);
console.log(map); //[2, 8, 18, 32]
배열 내의 요소가 객체인 경우에도 사용할 수 있습니다.
var kvArray = [
{ key: 1, value: 10 },
{ key: 2, value: 20 },
{ key: 3, value: 30 },
];
var reformattedArray = kvArray.map(function (obj) {
if (obj.key % 2 === 1) {
//짝수
var rObj = {};
rObj[obj.key] = obj.value;
return rObj;
} else {
//홀수
var rObj = {};
rObj[obj.key] = obj.value + 1;
return rObj;
}
});
// reformattedArray는 [{1:10}, {2:21}, {3:30}]
// kvArray는 그대로
// [{key:1, value:10},
// {key:2, value:20},
// {key:3, value: 30}]
var kvArray = [
{ key: 1, value: 10 },
{ key: 2, value: 20 },
{ key: 3, value: 30 },
];
var reformattedArray = kvArray.map(function (obj) {
if (obj.key % 2 === 1) {
//짝수
var rObj = {};
rObj[obj.key] = obj.value;
return rObj;
} else {
//홀수
var rObj = {};
rObj[obj.key] = obj.value + 1;
return rObj;
}
});
// reformattedArray는 [{1:10}, {2:21}, {3:30}]
// kvArray는 그대로
// [{key:1, value:10},
// {key:2, value:20},
// {key:3, value: 30}]
다음과 같이 함수안에서 홀수 짝수를 나누어 사용할 수도 있습니다.
직접 구현해보기
map
함수를 직접 구현 후 Array.prototype
에 객체에 등록 후 사용해보겠습니다.
Array.prototype.myMap = function myMap(cb) {
const result = [];
for (let idx = 0; idx < this.length; idx++) {
result.push(cb(this[idx], idx, this));
}
return result;
};
Array.prototype.myMap = function myMap(cb) {
const result = [];
for (let idx = 0; idx < this.length; idx++) {
result.push(cb(this[idx], idx, this));
}
return result;
};
[1, 2, 3].myMap((v) => v * 2); // [2, 4, 6]
[1, 2, 3].myMap((v) => v * 2); // [2, 4, 6]
[1, 2, 3].myMap((v, idx) => {
if (idx > 1) {
return v * 2;
} else {
return v;
}
}); // [1, 2, 6]
[1, 2, 3].myMap((v, idx) => {
if (idx > 1) {
return v * 2;
} else {
return v;
}
}); // [1, 2, 6]
2️⃣ filter
filter함수는 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환 합니다.
const words = [
"spray",
"limit",
"elite",
"exuberant",
"destruction",
"present",
];
const result = words.filter((word) => word.length > 6);
console.log(result);
// expected output: Array ["exuberant", "destruction", "present"]
const words = [
"spray",
"limit",
"elite",
"exuberant",
"destruction",
"present",
];
const result = words.filter((word) => word.length > 6);
console.log(result);
// expected output: Array ["exuberant", "destruction", "present"]
위 예제에서는 length가 6이상인 요소를 모아 새로운 배열을 만듭니다.
const guys = [
{ name: "YD", money: 500000 },
{ name: "Bill", money: 400000 },
{ name: "Andy", money: 300000 },
{ name: "Roky", money: 200000 },
];
const richNames = guys
.filter((man) => man.money > 300000)
.map((man) => man.name);
console.log(richNames); // ["YD", "Bill"]
const guys = [
{ name: "YD", money: 500000 },
{ name: "Bill", money: 400000 },
{ name: "Andy", money: 300000 },
{ name: "Roky", money: 200000 },
];
const richNames = guys
.filter((man) => man.money > 300000)
.map((man) => man.name);
console.log(richNames); // ["YD", "Bill"]
filter의 반환값이 배열이라는 점을 이용해 map함수와 함께 사용할 수 있습니다.
직접 구현해보기
filter
함수를 직접 구현 후 Array.prototype
에 객체에 등록 후 사용해보겠습니다.
Array.prototype.myFilter = function myMap(cb) {
const result = [];
for (let idx = 0; idx < this.length; idx++) {
if (cb(this[idx], idx, this)) {
result.push(this[idx]);
}
}
return result;
};
Array.prototype.myFilter = function myMap(cb) {
const result = [];
for (let idx = 0; idx < this.length; idx++) {
if (cb(this[idx], idx, this)) {
result.push(this[idx]);
}
}
return result;
};
[1, 2, 3].myFilter((v) => v > 1); // [2, 3]
[1, 2, 3].myFilter((v) => v > 1); // [2, 3]
[1, 2, 3].myFilter((v, idx) => idx > 1); // [3]
[1, 2, 3].myFilter((v, idx) => idx > 1); // [3]
3️⃣ reduce
reduce()
함수는 배열의 각 요소에 대해 주어진 reducer함수를 실행하고, 하나의 결과값을 반환합니다.
reduce 함수의 원형은 다음과 같습니다.
reduce((누적값, 현재값, index, value) => {return 결과;} , 초기값)
누적값은 현재까지의 누적값을 의미합니다.
const arr = [1, 2, 3];
const result = arr.reduce((acc, cur, i) => {
console.log(acc, cur, i);
return acc + cur;
}, 0);
// 0 1 0
// 1 2 1
// 3 3 2
// result : 6
const arr = [1, 2, 3];
const result = arr.reduce((acc, cur, i) => {
console.log(acc, cur, i);
return acc + cur;
}, 10);
// 10 1 0
// 11 2 1
// 13 3 2
// result : 16
const arr = [1, 2, 3];
const result = arr.reduce((acc, cur, i) => {
console.log(acc, cur, i);
return acc + cur;
}, 0);
// 0 1 0
// 1 2 1
// 3 3 2
// result : 6
const arr = [1, 2, 3];
const result = arr.reduce((acc, cur, i) => {
console.log(acc, cur, i);
return acc + cur;
}, 10);
// 10 1 0
// 11 2 1
// 13 3 2
// result : 16
초기값을 적어주지 않을 경우, 자동으로 첫번째 요소로 초기화됩니다.
위 코드를 통해 초기값은 첫번째 callback함수의 인수로 제공되는 값임을 알 수 있습니다.
const arr = [1, 2, 3];
const result = arr.reduce((acc, cur, i) => {
if (cur % 2 === 1) acc.push(cur);
return acc;
}, []);
const arr = [1, 2, 3];
const result = arr.reduce((acc, cur, i) => {
if (cur % 2 === 1) acc.push(cur);
return acc;
}, []);
다음과 같이 초기값을 배열로 세팅하고, 조건문을 이용하면, filter함수의 역할을 하는 reduce함수를 만들 수 있습니다.
filter함수 뿐만 아니라, sort, find, findIndex 등등 다른 함수들도 reduce함수를 이용해 구현할 수 있습니다.
직접 구현해보기
reduce
함수를 직접 구현 후 Array.prototype
에 객체에 등록 후 사용해보겠습니다.
Array.prototype.myReduce = function myMap(cb, initialValue) {
let result = initialValue;
for (let idx = 0; idx < this.length; idx++) {
result = cb(result, this[idx], this);
}
return result;
};
Array.prototype.myReduce = function myMap(cb, initialValue) {
let result = initialValue;
for (let idx = 0; idx < this.length; idx++) {
result = cb(result, this[idx], this);
}
return result;
};
[1, 2, 3].myReduce((acc, cur) => acc + cur, 0); // 6
[1, 2, 3].myReduce((acc, cur) => acc + cur, 0); // 6
["1", "2", "3"].myReduce((acc, cur) => acc + cur, ""); // "123"
["1", "2", "3"].myReduce((acc, cur) => acc + cur, ""); // "123"