๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Front-end/JS

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐฐ์—ด ๊ณ ์ฐจํ•จ์ˆ˜ forEach / map

by ciocio 2021. 8. 23.

๐Ÿ“  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 ๋ฉ”์„œ๋“œ๋Š” ์š”์†Œ๊ฐ’์„ ๊ฐ€๋ฅธ ๊ฐ’์œผ๋กœ ๋งคํ•‘ํ•œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜์ด๋‹ค.

 

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€