2019๋ 4์ 12์ผ
์๋ฐ์คํฌ๋ฆฝํธ์์๋ forEach(), map(), filter()๋ฅผ ์์ ์์ฌ๋ก ๋ค๋ฃฐ ์ค ์์์ผํ๋ค.
for ๋ฌธ ๋์ ์ ์ด ์ธ ๊ฐ์ง๋ฅผ ์ฐ๋ฉด์ ์ฐ์ตํ์.
reduce() ํจ์๋ ๊ณต๋ถํ์. ์๋ฒ์ ํด๋ผ์ด์ธํธ์์ ๋งค์ฐ ๋ง์ด ์ฌ์ฉ๋๋ ํจ์์ด๋ค.
๊ตฌ๋ถ์
๋ฅผ ๊ธฐ์ค์ผ๋ก ํฉ์น ์ ๋ฌธ์์ด์ ๋ฐํํ๋ค.๊ตฌ๋ถ์
๋ฅผ ์ ๋ ฅํ์ง ์์ผ๋ฉด ์ผํ(,
)๊ฐ ๊ตฌ๋ถ์๊ฐ ๋๋ค.
var array = [1, 2, 3];
array.join(); // "1,2,3"
array.join(':'); // "1:2:3"
- ๋ฐฐ์ด์ ๋ณํฉ(merge)ํ ์ ๋ฐฐ์ด์ ๋ฐํํ๋ค.
var array = [1,2,3];
array = array.concat(4,5); // [1,2,3,4,5]
array.concat([6,7]); // [1,2,3,4,5,6,7]
array.push(item)
: ๋ฐฐ์ด์ ๋งจ ๋์item
์ ์ถ๊ฐํ๊ณ ๋ณ๊ฒฝ๋ ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ๋ฐํํ๋ค.array.pop()
: ๋ฐฐ์ด์ ๋งจ ๋ ํญ๋ชฉ์ ์ญ์ ํ๋ค.
var array = [1,2,3];
array.push(4); // 4
array; // [1,2,3,4]
array.pop(); // [4]
array.unshift(item)
: ๋ฐฐ์ด์ ๋งจ ์์item
์ ์ถ๊ฐํ๊ณ ๋ณ๊ฒฝ๋ ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ๋ฐํํ๋ค.array.shift()
: ๋ฐฐ์ด์ ๋งจ ์ ํญ๋ชฉ์ ์ญ์ ํ๋ค.
- splice๋ฅผ ์ด์ฉํ๋ฉด ๋ฐฐ์ด์ ์ค๊ฐ์๋ ํญ๋ชฉ(item)์ ์ถ๊ฐ ์ญ์ ํ ์ ์๋ค.
var array = [1,2,3,4];
array.splice(2, 1, 5); // 3
array; // [1,2,5,4];
- ์ญ์ ํ์ง ์๊ณ ์ถ๊ฐ๋ง ํ๊ณ ์ถ์ผ๋ฉด
์ง์ธ ๊ฐ์
์0
์ ๋ฃ์ผ๋ฉด ๋๋ค.splice(์์์ , 0, ์ถ๊ฐํ ํญ๋ชฉ)
- every: ๋ฐฐ์ด์ ๋ชจ๋ ํญ๋ชฉ์ด true๋ฉด true๋ฅผ ๋ฐํํ๋ค.
- some: ๋ฐฐ์ด์ ์ผ๋ถ ํญ๋ชฉ์ด true๋ฉด true๋ฅผ ๋ฐํํ๋ค.
var array = [1, 3, 5, 7, 9];
array.every(function(i) {
return i % 2 === 1;
}); // true
array.every(function(i) {
return i < 9;
}); // false
array.some(function(i) {
return i === 9;
}); // true
forEach(), map(), reduce()
์ฝ๋ฐฑ ํจ์๋ฅผ ํตํด ๊ฐ ์์(element)์ ๋ํ ์ ๋ณด๋ฅผ ๋ฐ๋๋ค.
- ์ฝ๋ฐฑ ํจ์์ ์ธ์๋ก๋ถํฐ ์ ๋ฌ๋๋ ์ ๋ณด
- currentValue: ๋ฐฐ์ด์์ ํ์ฌ ์
๋ ฅ๋ฐ๋
element
. - index: ๋ฐฐ์ด์์ ํ์ฌ ์
๋ ฅ๋ฐ๋
element์ ์ธ๋ฑ์ค
. - array:
forEach()
๋ฅผ ํธ์ถํ ๋ฐฐ์ด (๋๋จธ์ง ๋ฉ์๋๋ ๋์ผ)
- currentValue: ๋ฐฐ์ด์์ ํ์ฌ ์
๋ ฅ๋ฐ๋
- ๋ฐฐ์ด์ ๊ฐ ์์(element)์ ๋ํ์ฌ ์กฐ๊ฑด์์ ํจ์๋ฅผ ์ ์ฉํ๋ค.
var array1 = ['a', 'b', 'c'];
array1.forEach(function(element) {
console.log(element);
});
// expected output: "a"
// expected output: "b"
// expected output: "c"
- for ๋ฌธ๊ณผ forEach() ๋น๊ต
// for loop
var arr = [3, 9, 4, 2, 7, 6];
for (var i = 0; i < arr.length; i++) {
if (arr[i] % 2 == 0) {
console.log(arr[i]);
}
}
// forEach()
var arr = [3, 9, 4, 2, 7, 6];
arr.forEach(function (n) {
if (n % 2 == 0) {
console.log(n);
}
});
for loop
๋์forEach()
๋ฅผ ์ฐ๋ฉด ์ข์ ์ - ๊ฐ๋ ์ฑ์ด ๋์์ง๋ค.
forEach
๋ ์ฝ๋ฐฑ ํจ์์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๊ฐelement
๊ฐ์ ๋ฐ๋๋ค.- ๋ฐ๋ผ์ ์ธ๋ฑ์ค ๊ฐ๊ณผ
element
๋ฅผ ๋ฐ๊ธฐ์ํ ๋ณ์ (i
,arr[i]
) ๊ฐ ํ์์๋ค.
์ฝ๋ฐฑ ํจ์์ ๋ฆฌํด์ ๋ชจ์์ ์๋ก์ด ๋ฐฐ์ด์ ๋ง๋ ๋ค.
map()์ ์ด์ฉํ๋ฉด ์๋ณธ ๋ฐฐ์ด์ ์ ์งํ ์ฑ ์๋ก์ด ๋ฐฐ์ด์ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ค.
- forEach ์ ์ฐจ์ด์ : 1) map์ ๋ฐ๋ ์ ๋ฐฐ์ด์ ๋ฐํํ์ง๋ง, forEach๋ ๋ฐํํ์ง ์๋๋ค.
// ๋ฐฐ์ด์ ๊ฐ ํญ๋ชฉ์ +1 ์ ํ๊ณ ๋ฆฌํดํ๋ ํจ์
var array = [1,2,3];
array.map(function(x) {
return x+1;
}); // [2,3,4]
var array = [1,2,3];
array.forEach(function(x) {
return x+1;
}); // undefined
- forEach ์ ์ฐจ์ด์ : 2) ์ฝ๋๊ฐ ์ง๊ด์ ์ด๊ณ ๊ฐ๋ ์ฑ์ด ๋๋ค.
map()
์ ๋ถ๋ชจ ์ค์ฝํ ์์ญ์ ๊ฑด๋๋ฆฌ์ง ์๊ณ ์ฝ๋ฐฑ ํจ์๋ง์ผ๋ก ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป๋๋ค. (์ฌ์ด๋ ์ดํํธ ์์)- ํจ์ ๋ฐ์ ์๋ ์ค์ฝํ(scope)์ ๋ณ์(variable)๋ฅผ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ ์ง๊ด์ ์ด๋ค.
// ๋ฌธ์์ด ๋ฐฐ์ด์์ ๋ฌธ์์ด ๊ธธ์ด๋ฅผ ๋ฆฌํดํ๋ ํจ์
// ํจ์๋ง ๋ด๋ ์ด๋ค ์ผ์ ํ๋์ง ์ ์ ์๋ค.
var arr = ['foo', 'hello', 'diamond', 'A'];
var arr2 = arr.map(function (str) {
return str.length;
});
console.log(arr2); // [3, 5, 7, 1]
// for ๋ฌธ์ ์ฌ์ฉํ๋ฉด ํจ์ ๋ด์์ ์ธ๋ถ ๋ณ์ arr2๋ฅผ ์ฐธ์กฐํด์ผํ๋ค.
// ๋ถ๋ชจ ์ค์ฝํ๊น์ง ์ ๊ฒฝ์จ์ผ ํ๋ฏ๋ก ์ง๊ด์ ์ด์ง ์๋ค.
var arr = ['foo', 'hello', 'diamond', 'A'];
var arr2 = [];
arr.forEach(function (str) {
arr2.push(str.length);
});
console.log(arr2); // [3, 5, 7, 1]
- ํน์ ์กฐ๊ฑด์ ํด๋นํ๋ ์์(element)๋ง ๊ฑธ๋ฌ๋ด ์ ๋ฐฐ์ด๋ก ๋ง๋ ๋ค.
// ๋ฐฐ์ด ์์ ์ง์๋ง ๋จ๊ธฐ๊ณ ๋ฆฌํดํ๋ ํจ์
var array = [1,2,3,4,5];
array.filter(function(x) {
return x % 2 === 0;
}); // [2,4]
- ์ฝ๋ฐฑ ํจ์์ ๋ฆฌํด์
boolean
์ ๊ฐ๋๋ค. - ๋ฆฌํด์ด
true
์ธ ์์๋ง ๋ชจ์์ ์๋ก์ด ๋ฐฐ์ด์ ๋ง๋ ๋ค. - ์๋ตํ๋ฉด ๋ฆฌํด์
undefined
์ด๋ฏ๋กfalse
๊ฐ ๋๋ค. - ๋ฆฌํด์ด
true
์ธ ์์๊ฐ ์๋ค๋ฉด ๋น ๋ฐฐ์ด[]
์ด ๋ฐํ๋๋ค.
var arr = [4, 377, 1024];
var arr2 = arr.filter(function (n) {
return n % 5 == 0;
});
console.log(arr2); // []
undefined
๋ ์๋ ๋น ๋ฐฐ์ด[]
์ ๋ฐํํ๋ ๊ฒ์ ๋งค์ฐ ํฐ ์๋ฏธ๋ฅผ ๊ฐ๋๋ค.- ๋ณดํต ๋๋ฉ์ธ์ ํด๊ฒฐํ๊ธฐ ์ํด์ Array ๋ฉ์๋๋ฅผ ์ฌ๋ฌ๊ฐ ์ฐ๊ฒฐํด ์ฌ์ฉํ๋ค.
- ์ด ๋
undefined
์ด ์๋ ๋น ๋ฐฐ์ด[]
์ ๋ฐํ ํจ์ผ๋ก์จ ์ค๊ฐ์ ์ค๋ฅ๊ฐ ๋์ง ์๊ณ ๋ค์ Array ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
// ์กฐ๊ฑด์ ๋ง๋ ์์๊ฐ ์๋ ๊ฒฝ์ฐ
var arr = [4, 377, 1024]; // 5์ ๋ฐฐ์๊ฐ ์์.
var arr2 = arr.filter(function (n) {
return n % 5 == 0;
}).map(function (n) { // filter๋ก๋ถํฐ ๋น ๋ฐฐ์ด์ด ๋ฐํ๋จ.
return n * 2;
});
console.log(arr2); // []. map()์ ์ฝ๋ฐฑ ํจ์๋ ๊ฒฐ๊ตญ ํ ๋ฒ๋ ํธ์ถ๋์ง ์์์ผ๋ ๋ฌธ์ ์์.
-
reduce()
๋ฉ์๋๋map(), filter()
๋ฅผ ๋์ฒดํ ์ ์๋ค. -
๋ฐฐ์ด์ ์ผ์ชฝ๋ถํฐ ์กฐ๊ฑด์ ์ ์ฉํด ํ๋์ ๊ฐ์ผ๋ก ๋ง๋ ๋ค.
-
์ค๋ฅธ์ชฝ๋ถํฐ ์กฐ๊ฑด์ ์ ์ฉํ๊ณ ์ถ์ผ๋ฉด
reduceRight()
๋ฅผ ์ด๋ค.
1. callback ํจ์
- previousValue: ์ด์
๋ง์ง๋ง ์ฝ๋ฐฑ ํธ์ถ
์์ ๋ฐํ๋ ๊ฐ. - currentValue: ๋ฐฐ์ด ๋ด ํ์ฌ ์ฒ๋ฆฌ๋๊ณ ์๋
element
. - currentIndex: ๋ฐฐ์ด ๋ด ํ์ฌ ์ฒ๋ฆฌ๋๊ณ ์๋
element์ ์ธ๋ฑ์ค
- array:
reduce()
์ํธ์ถ๋๋ ๋ฐฐ์ด
2. initialValue(์ด๊ธฐ๊ฐ): ์ ํ์ฌํญ. callback์ ์ฒซ ํธ์ถ
์ ์ฒซ ๋ฒ์งธ ์ธ์
๋ก ์ฌ์ฉํ๋ ๊ฐ.
- ๋ค๋ฅธ ๋ฉ์๋์๋ ๋ฌ๋ฆฌ
initialValue
๋ผ๋ ๋ ๋ฒ์งธ ์ธ์๋ฅผ ๋ฃ์ ์ ์๋ค. - ์ค์!:
reduce()
์return
์๋ฐฐ์ด(array)
,๋ฐฐ์ด์ element
๋๋์ฌ์ฉ์๊ฐ ์ํ๋ ๊ฐ
์ด ๋ ์ ์๋ค.
// ๋ฐฐ์ด์ ์ผ์ชฝ๋ถํฐ ๋ํ ๊ฐ์ ๋ฆฌํดํ๋ ํจ์
var arr = [1, 2, 3, 4, 5];
arr.reduce(function(prev, cur) {
return prev + cur;
}); // 15
- ์ ํจ์์ ํธ์ถ ์์๋ฅผ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
ํธ์ถ ์์ | pre | cur | return |
---|---|---|---|
1 | 1 (์ฒซ ๋ฒ์งธ element) | 2 | 3 (1+2) |
2 | 3 | 3 | 6 (3+3) |
3 | 6 | 4 | 10 (6+4) |
4 | 10 | 5 | 15 (10+5) |
reduce
์ ๋ ๋ฒ์งธ ์ธ์์ธinitialValue
๋ฅผ ์๋ตํ๊ธฐ ๋๋ฌธ์pre
์ ์ฒซ๋ฒ์งธelement
๋ก1
์ด ์ ๋ฌ๋์๋ค.
// ๋ฐฐ์ด ์์์ ํฉ ๊ณ์ฐํ๊ธฐ
var arr = [1, 2, 3, 4, 5];
var count = 0;
var sum = arr.reduce(function (pre, value) {
count++;
return pre + value;
}, 0); // initialValue๊ฐ ์ฃผ์ด์ก๋ค!
console.log(sum); // 15
console.log(count); // 5
- ์ ํจ์์ ํธ์ถ ์์๋ฅผ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
ํธ์ถ ์์ | pre | cur | return |
---|---|---|---|
1 | 0 (initialValue) | 1 | 1 (0+1) |
2 | 1 | 2 | 3 (1+2) |
3 | 3 | 3 | 6 (3+3) |
4 | 6 | 4 | 10 (6+4) |
5 | 10 | 5 | 15 (10+5) |
- ์์
map()
๊ณผfilter()
๋ก ๊ตฌํํ ์์ ๋ฅผreduce()
๋ก ๊ตฌํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
// map - ๋ฌธ์์ด ๋ฐฐ์ด์์ ๋ฌธ์์ด ๊ธธ์ด๋ง ํ๋ํ๊ธฐ
// reduce๋ก ๊ตฌํ
var arr = ['foo', 'hello', 'diamond', 'A'];
var arr2 = arr.reduce(function (pre, value) {
pre.push(value.length);
return pre;
}, []);
console.log(arr2); // [3, 5, 7, 1]
// filter - ์ ์ ๋ฐฐ์ด์์ 2์ ๋ฐฐ์์ธ ์ ์๋ง ๋ชจ์ผ๊ธฐ
// reduce๋ก ๊ตฌํ
var arr = [1,2,3,4,5];
var arr2 = arr.reduce(function (pre, value) {
if (value % 2 == 0) {
pre.push(value);
}
return pre;
}, []);
console.log(arr2); // [2,4]
-
์์ ์์ ๋
reduce()
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋คfilter()
์map()
์ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ๋ ์ฑ์ด ์ข๋ค. -
๋ฐ๋ผ์ ์ํฉ์ ๋ฐ๋ผ ์ ์ ํ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
-
reduce()
๋ฉ์๋๋ฅผ ๊ฐ์ฒด(object)์๋ ์ ์ฉํ ์ ์๋ค.
var obj = {
apple: 500,
grape: 2000,
berry: 30
};
- ์
๊ฐ์ฒด(object)
์์ ๊ฐkey
์ ํด๋นํ๋value
๊ฐ์ ๋ํ๊ณ ์ถ๋ค. - ๊ทธ๋ฐ๋ฐ
reduce()
๋ฉ์๋๋๋ฐฐ์ด(array)
์๋ง ์ฌ์ฉํ ์ ์๋ค. Object.keys
๋ฅผ ์ด์ฉํ๋ฉด๊ฐ์ฒด(object)
์key
๊ฐ์๋ฐฐ์ด(array)
๋ก ๋ง๋ค ์ ์๋ค.
var obj = {
apple: 500,
grape: 2000,
berry: 30 };
var sum = Object.keys(obj).reduce(function (pre, value) {
return pre + obj[value];
}, 0);
console.log(sum); // 2530
- ํ์ง๋ง ๊ฐ์ฒด๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์
for -in
์ ์ฌ์ฉํ๋ ๊ฒ ๋ ๊ฐ๋จํ๋ค.
var obj = {
apple: 500,
grape: 2000,
berry: 30
};
var sum = 0;
for (let prop in obj) {
sum += obj[prop];
}
console.log(sum); // 2530
- ๋ฐฐ์ด์ ์์(element)๋ฅผ ํ์ํ ๋
forEach()
์ด์ธ์ ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ์ ์ ํ ์ฌ์ฉํ ์ค ์์์ผํ๋ค. - ์ฝ๋ฐฑ ํจ์์์ ์์ ์ค์ฝํ(scope)์ ๋ณ์ ๊ฑด๋๋ฆฌ๋ ์ฌ์ด๋ ์ดํํธ๋ฅผ ๋ฐ์์ํค์ง ์๋๋ก ์ฃผ์ํ์.
์ฝ๋ฐฑ ํจ์์์ ๋ถ๋ชจ ์ค์ฝํ์ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋๊ฒ ์ํํ ์ด์ (์ฌ์ด๋ ์ดํํธ)
- ๋ถ๋ชจ ์ค์ฝํ์ ๋ณ์๋ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ ์ํ์ด ์๋ค.
var arr = [
{x1: 1, x2: 1},
{x1: 2, x2: 2},
{x1: 3, x2: 3}
];
var arr2 = null;
console.log(arr2);
/**
1. arr์ ๋ณ๊ฒฝ์ฌํญ์ด ์์ด์ผ ํ๋ค.
2. arr2๋ ๋ค์๊ณผ ๊ฐ์์ผ ํ๋ค.
[
{x1: 1, x2: 1, result: 1},
{x1: 2, x2: 2, result: 4},
{x1: 3, x2: 3, result: 9}
]
*/
- ์์ ๊ฐ์ด arr2์ ๋ฐฐ์ด์ ๋ง๋๋ ํจ์๋ฅผ ์์ฑํ๋ค๊ณ ๊ฐ์ ํ์.
arr2 = arr.map(function (obj) {
obj.result = obj.x1 * obj.x2;
return obj;
});
console.log(arr);
/**
1. arr
[
{x1: 1, x2: 1, result: 1},
{x1: 2, x2: 2, result: 4},
{x1: 3, x2: 3, result: 9}
]
*/
console.log(arr2);
/**
2. arr2
[
{x1: 1, x2: 1, result: 1},
{x1: 2, x2: 2, result: 4},
{x1: 3, x2: 3, result: 9}
]
*/
- ์์ ๊ฒฝ์ฐ arr๊ณผ arr2๊ฐ ๋์์ ๋ณ๊ฒฝ ๋์๋ค.
- ์ฆ ๋ถ๋ชจ ์ค์ฝํ์ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ๋ค.
var arr = [
{x1: 1, x2: 1},
{x1: 2, x2: 2},
{x1: 3, x2: 3}
];
var arr2 = null;
arr2 = arr.map(function (obj) {
return {
x1: obj.x1,
x2: obj.x2,
result: obj.x1 * obj.x2
};
});
console.log(arr);
/**
1. arr
[
{x1: 1, x2: 1},
{x1: 2, x2: 2},
{x1: 3, x2: 3}
]
*/
console.log(arr2);
/**
2. arr2
[
{x1: 1, x2: 1, result: 1},
{x1: 2, x2: 2, result: 4},
{x1: 3, x2: 3, result: 9}
]
*/
- ์์ ๊ฒฝ์ฐ ๋ถ๋ชจ ์ค์ฝํ ๋ณ์์ ๋ณ๊ฒฝ์ฌํญ ์์ด ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ์์
Array, Function, Object
๋call by reference
๋ก ์ ๋ฌ๋๋ค. - ๋ฐ๋ผ์ ์ฝ๋ฐฑ ํจ์์ ์ธ์๋ก ์ ๋ฌ๋ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋ถ๋ชจ ์ค์ฝํ์๋ ๋ฐ์๋๋ค.
- ๊ทธ๋ฌ๋ฏ๋ก ์ฝ๋ฐฑ ํจ์ ์์ฒด ์ค์ฝํ ์์ญ์ ๋ฒ์ด๋์ง ์๋๋ก ์ฃผ์ํ์