μλ°μ€ν¬λ¦½νΈ λ°°μ΄ κ³ μ°¨ν¨μ forEach / map
π 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 λ©μλλ μμκ°μ κ°λ₯Έ κ°μΌλ‘ 맀νν μλ‘μ΄ λ°°μ΄μ μμ±νλ κ³ μ°¨ ν¨μμ΄λ€.