본문 바로가기
FrontEnd/JavaScript

[ JavaScript ] flatMap()

by ウリ김영은 2023. 10. 31.

Array.prototype.flatMap() 이란?

  • 배열의 각 요소에 주어진 콜백 함수를 적용한 다음 그 결과를 한 단계씩 평탄화하여 형성된 새 배열을 반환한다.(콜백에서 반환된 유사배열은 평탄화하지 않는다)
  • map()뒤에 깊이 1의 flat()을 체이닝 하는 것(arr.map(...args).flat(1))과 동일하지만, 두 메서드를 따로 호출하는 것보다 더 효율적이다.
const arr1 = [1, 2, 3, 4];

arr1.map((x) => [x * 2]); // [[2], [4], [6], [8]]

arr1.flatMap((x) => [x * 2]); // [2, 4, 6, 8]

// 오직 한 단계만 평탄화됩니다.
arr1.flatMap((x) => [[x * 2]]); // [[2], [4], [6], [8]]
const arrayLike = {
  length: 3,
  0: 1,
  1: 2,
  2: 3,
  3: 4, 
  // length가 3이므로 flatMap()에 의해 무시됩니다.
};
console.log(Array.prototype.flatMap.call(arrayLike, (x) => [x, x * 2]));
// [1, 2, 2, 4, 3, 6]

// 콜백에서 반환된 유사 배열은 평탄화되지 않습니다.
console.log(
  Array.prototype.flatMap.call(arrayLike, (x) => ({
    length: 1,
    0: x,
  })),
);
// [ { '0': 1, length: 1 }, { '0': 2, length: 1 }, { '0': 3, length: 1 } ]

FlapMap takes single pass & doesn't produce intermediate array


// using filterAndMap
console.time("filterAndMap")
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

const squaredOddNumbers = numbers
    .filter(num => num % 2 !== 0)
    .map(num => num * num)

console.log(squaredOddNumbers); // [1, 9, 25, 49, 81]
console.timeEnd("filterAndMap")

 


 

참조
https://javascript.plainenglish.io/i-bet-you-dont-use-these-javascript-tricks-and-pratices-5ab5438ed4c8
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap