๐ Array.prototype.forEach ( immutable โณ )
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ ์์ ํจ์์ ๋ณด์กฐ ํจ์์ ์กฐํฉ์ ํตํด ๋ก์ง ๋ด์ ์กด์ฌํ๋ ์กฐ๊ฑด๋ฌธ๊ณผ ๋ฐ๋ณต๋ฌธ์ ์ ๊ฑฐํ์ฌ
๋ณต์ก์ฑ์ ํด๊ฒฐํ๊ณ , ๋ณ์์ ์ฌ์ฉ์ ์ต์ ํ์ฌ ์ํ ๋ณ๊ฒฝ์ ํผํ๋ ค๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ด๋ค.
forEach ๋ฉ์๋๋ for๋ฌธ์ ๋์ฒดํ ์ ์๋ ๊ณ ์ฐจํจ์๋ค.
๋ฐ๋ณต๋ฌธ์ ์ถ์ํํ ๊ณ ์ฐจ ํจ์๋ก์ ๋ด๋ถ์์ ๋ฐ๋ณต๋ฌธ์ ํตํด ์์ ์ ํธ์ถํ ๋ฐฐ์ด์ ์ํํ๋ฉด์
์ํํด์ผ ํ ์ฒ๋ฆฌ๋ฅผ ์ฝ๋ฐฑ ํจ์๋ก ์ ๋ฌ๋ฐ์ ๋ฐ๋ณต ํธ์ถํ๋ค.
const number = [1, 2, 3];
const pows = [];
numbers.forEach(item => pows.push(item ** 2));
console.log(pows); // [1, 4, 9];
๐ forEach ๋ฉ์๋๋ ์ต๋ 2๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ ์ ์๋ค.
01 ์ฝ๋ฐฑ ํจ์
02 'this'๋ก ์ฌ์ฉํ ๊ฐ์ฒด ( ์ผ๋จ class ํ์ )
๐ forEach ๋ฉ์๋์ ์ฝ๋ฐฑํจ์๋ ์ต๋ 3๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ ์ ์๋ค.
01 forEach ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ฐฐ์ด์ ์์๊ฐ
02 forEach ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ฐฐ์ด์ ์ธ๋ฑ์ค
03 forEach ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ฐฐ์ด ์์ฒด ( this )
๐ ์์ฑ
[1, 2, 3].forEach((item, index, arr) => {
console.log(`์์๊ฐ: ${item}, ์ธ๋ฑ์ค: ${index}, this: ${JSON.stringify(arr)}`);
return item; // ๋งน๋ชฉ์ return
});
/*
์์๊ฐ: 1, ์ธ๋ฑ์ค: 0, this: [1,2,3]
์์๊ฐ: 2, ์ธ๋ฑ์ค: 1, this: [1,2,3]
์์๊ฐ: 3, ์ธ๋ฑ์ค: 2, this: [1,2,3]
*/
โพ JSON.stringify ๋ฉ์๋ ?
์ด ๋ฉ์๋๋ ๊ฐ์ฒด๋ฅผ JSON ํฌ๋งท์ ๋ฌธ์์ด๋ก ๋ณํํ๋ค. ์ ์์ ์์๋ ๊ฐ์ฒด์ธ arr ๋ฐฐ์ด์ ( ๋ฐฐ์ด ⊂ ๊ฐ์ฒด ) ๋ฌธ์์ด๋ก ์ถ๋ ฅํ๊ธฐ ์ํด ์
const numbers = [1, 2, 3];
// forEach ๋ฉ์๋๋ ์๋ณธ ๋ฐฐ์ด์ ๋ณ๊ฒฝํ์ง๋ ์์ง๋ง !!
// ์ฝ๋ฐฑ ํจ์๋ฅผ ํตํด ์๋ณธ ๋ฐฐ์ด์ ๋ณ๊ฒฝํ ์๋ ์๋ค. ํ ์ ๋ ์ ๋ค ํ ํ
numbers.forEach((item, index, arr) => { arr[index] = item ** 2 });
console.log(numbers); // [1, 4, 9]
โ forEach ๋ฉ์๋์ ๋ฐํ๊ฐ์ ์ธ์ ๋ undefined์ด๋ค โ
let arr = [];
const result = [1, 2, 3].forEach(item => arr.push(item + 2));
console.log(result); // undefined
class Numbers {
numberArray = [];
multiply(arr) {
arr.forEach(function(item){
this.numberArray.push(item * item);
}, this);
// ์ด๋ ๊ฒ 2๋ฒ์งธ ์ธ์๋ก this ์ ๋ฌ ์ํด์ฃผ๋ฉด this.numberArray์ this๋ undefined ๋น๋๋ค
// ์ด์ 1: ํด๋์ค ๋ด๋ถ์ ๋ชจ๋ ์ฝ๋์๋ ์๋ฌต์ ์ผ๋ก strict mode๊ฐ ์ ์ฉ๋๋ค.
// ์ด์ 2: forEach์ ํ์ดํ ํจ์๊ฐ ์๋ ์ผ๋ฐ ํจ์๊ฐ ๋ค์ด์์๋ค.
}
}
const numbers = new numbers();
numbers.multiply([1, 2, 3]);
console.log(numbers.numberArray); // [1, 4, 9]
class Numbers {
numberArray = [];
multiply(arr) {
arr.forEach(item => this.numberArray.push(item * item));
}
}
const numbers = new numbers();
numbers.multiply([1, 2, 3]);
console.log(numbers.numberArray); // [1, 4, 9]
๐ Array.prototype.map ( immutable )
map ๋ฉ์๋๋ ์์ ์ ํธ์ถํ ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ์ํํ๋ฉด์ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฐ๋ณต ํธ์ถํ๋ค.
์ฝ๋ฐฑ ํจ์์ ๋ฐํ๊ฐ๋ค๋ก ๊ตฌ์ฑ๋ ์๋ก์ด ๋ฐฐ์ด์ ๋ฐํํ๋ค. ์ด๋ ์๋ณธ ๋ฐฐ์ด์ ๋ณ๊ฒฝ๋์ง ์๋๋ค.
const numbers = [1, 4, 9];
const roots = numbers.map(item => Math.sqrt(item));
// ์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
// const roots = numbers.map(Math.sqrt);
console.log(roots); // [1, 2, 3]
console.log(numbers); // [1, 4, 9]
๐ map ๋ฉ์๋๋ ์ต๋ 2๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ ์ ์๋ค.
01 ์ฝ๋ฐฑ ํจ์
02 'this'๋ก ์ฌ์ฉํ ๊ฐ์ฒด ( ์ผ๋จ class ํ์ )
๐ map ๋ฉ์๋์ ์ฝ๋ฐฑํจ์๋ ์ต๋ 3๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ ์ ์๋ค.
01 map ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ฐฐ์ด์ ์์๊ฐ
02 map ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ฐฐ์ด์ ์ธ๋ฑ์ค
03 map ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ฐฐ์ด ์์ฒด ( this )
๐ ์์ฑ
[1, 2, 3].map((item, index, arr) => {
console.log(`์์๊ฐ: ${item}, ์ธ๋ฑ์ค: ${index}, this: ${JSON.stringify(arr)}`);
return item; // ๋งน๋ชฉ์ return
});
/*
์์๊ฐ: 1, ์ธ๋ฑ์ค: 0, this: [1,2,3]
์์๊ฐ: 2, ์ธ๋ฑ์ค: 1, this: [1,2,3]
์์๊ฐ: 3, ์ธ๋ฑ์ค: 2, this: [1,2,3]
*/
// map ๋ฉ์๋์ ๋ ๋ฒ์งธ ์ธ์๋ก map ๋ฉ์๋์ ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์์ this๋ก ์ฌ์ฉํ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ ์ ์๋ค.
class Prefixer {
constructor(prefix){
this.prefix = prefix;
}
add(arr){
return arr.map(function(item){
return this.prefix + item;
// ์ธ๋ถ์์ this๋ฅผ ์ ๋ฌํ์ง ์์ผ๋ฉด this๋ undefined๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
}, this); // map ๋ฉ์๋์ ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์์ this๋ก ์ฌ์ฉํ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ค.
}
}
const prefixer = new Prefixer('-webkit-');
console.log(prefixer.add(['transition', 'user-select']));
// ['-webkit-transition', '-webkit-user-select']
// ๋ ๋ฒ์งธ ์ธ์๋ฅผ ํตํด this ์ ๋ฌํ๋ ๋ฐฉ๋ฒ๋ง๊ณ !! ๋ ๋์ ๋ฐฉ๋ฒ -> ํ์ดํ ํจ์ ์ด์ฉํ๊ธฐ
class Prefixer {
constructor(prefix){
this.prefix = prefix;
}
add(arr){
return arr.map(item => this.prefix + item);
// ํ์ดํ ํจ์ ๋ด๋ถ์์ this๋ฅผ ์ฐธ์กฐํ๋ฉด ์์ ์ค์ฝํ์ this๋ฅผ ๊ทธ๋๋ก ์ฐธ์กฐํ๋ค ใทใท๐
}
}
const prefixer = new Prefixer('-webkit-');
console.log(prefixer.add(['transition', 'user-select']));
// ['-webkit-transition', '-webkit-user-select']
โพ forEach ๋ฉ์๋ vs map ๋ฉ์๋
00 ๊ณตํต์
์์ ์ ํธ์ถํ ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ์ํํ๋ฉด์ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฐ๋ณต ํธ์ถํ๋ค.
00 ์ฐจ์ด์
forEach ๋ฉ์๋๋ ์ธ์ ๋ undefined๋ฅผ ๋ฐํํ๋ค.
map ๋ฉ์๋๋ ์ฝ๋ฐฑ ํจ์์ ๋ฐํ๊ฐ๋ค๋ก ๊ตฌ์ฑ๋ ์๋ก์ด ๋ฐฐ์ด์ ๋ฐํํ๋ค.
์ฆ, forEach ๋ฉ์๋๋ ๋จ์ํ ๋ฐ๋ณต๋ฌธ์ ๋์ฒดํ๋ ๊ณ ์ฐจ ํจ์์ด๊ณ
map ๋ฉ์๋๋ ์์๊ฐ์ ๊ฐ๋ฅธ ๊ฐ์ผ๋ก ๋งคํํ ์๋ก์ด ๋ฐฐ์ด์ ์์ฑํ๋ ๊ณ ์ฐจ ํจ์์ด๋ค.
'Front-end > JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ฐ์คํฌ๋ฆฝํธ ํด๋ก์ ํ์ฉ Closure private ๋ณ์, ๋ฉ์๋ ํ๋ด ๋ด๊ธฐ (0) | 2021.08.28 |
---|---|
์๋ฐ์คํฌ๋ฆฝํธ ํด๋ก์ Closure (0) | 2021.08.27 |
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด ๋ฉ์๋ Array Method (๊ณ์ ์ถ๊ฐ์ค) (0) | 2021.08.21 |
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด ๊ณ ์ฐจํจ์ reduce (0) | 2021.08.15 |
์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ DOM (Document Object Model) (0) | 2021.08.14 |
๋๊ธ