ใ“ใฎใƒšใƒผใ‚ธใฏใ‚ณใƒŸใƒฅใƒ‹ใƒ†ใ‚ฃใƒผใฎๅฐฝๅŠ›ใง่‹ฑ่ชžใ‹ใ‚‰็ฟป่จณใ•ใ‚Œใพใ—ใŸใ€‚MDN Web Docs ใ‚ณใƒŸใƒฅใƒ‹ใƒ†ใ‚ฃใƒผใซใคใ„ใฆใ‚‚ใฃใจ็Ÿฅใ‚Šใ€ไปฒ้–“ใซใชใ‚‹ใซใฏใ“ใกใ‚‰ใ‹ใ‚‰ใ€‚

View in English Always switch to English

Array.prototype.flatMap()

Baseline Widely available

This feature is well established and works across many devices and browser versions. Itโ€™s been available across browsers since โจ2020ๅนด1ๆœˆโฉ.

flatMap() ใฏ Array ใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใฎใƒกใ‚ฝใƒƒใƒ‰ใงใ€ๆœ€ๅˆใซใƒžใƒƒใƒ”ใƒณใ‚ฐ้–ขๆ•ฐใ‚’ไฝฟ็”จใ—ใฆใใ‚Œใžใ‚Œใฎ่ฆ็ด ใ‚’ใƒžใƒƒใƒ—ใ—ใŸๅพŒใ€็ตๆžœใ‚’ๆ–ฐใ—ใ„้…ๅˆ—ๅ†…ใซๅนณๅฆๅŒ–ใ—ใพใ™ใ€‚ใ“ใ‚Œใฏใ€ map() ใฎๅพŒใซๆทฑใ• 1 ใฎ flat() ใ‚’่กŒใ†ใฎใจๅŒใ˜ใงใ™ใŒ (arr.map(...args).flat())ใ€ใ“ใ‚Œใ‚‰ 2 ใคใฎใƒกใ‚ฝใƒƒใƒ‰ใ‚’ๅˆฅใ€…ใซๅ‘ผใณๅ‡บใ™ใ‚ˆใ‚Šใ‚‚ใ‚ใšใ‹ใซๅŠน็އ็š„ใงใ™ใ€‚

่ฉฆใ—ใฆใฟใพใ—ใ‚‡ใ†

const arr = [1, 2, 1];

const result = arr.flatMap((num) => (num === 2 ? [2, 2] : 1));

console.log(result);
// ไบˆๆƒณใ•ใ‚Œใ‚‹็ตๆžœ: Array [1, 2, 2, 1]

ๆง‹ๆ–‡

js
flatMap(callbackFn)
flatMap(callbackFn, thisArg)

ๅผ•ๆ•ฐ

callbackFn

้…ๅˆ—ใฎใใ‚Œใžใ‚Œใฎ่ฆ็ด ใซๅฏพใ—ใฆๅฎŸ่กŒใ™ใ‚‹้–ขๆ•ฐใ€‚ใ“ใฎ้–ขๆ•ฐใฏใ€ๆ–ฐใ—ใ„้…ๅˆ—ใฎ่ฆ็ด ใ‚’ๆ ผ็ดใ—ใŸ้…ๅˆ—ใ‚’่ฟ”ใ™ใ‹ใ€ๆ–ฐใ—ใ„้…ๅˆ—ใซ่ฟฝๅŠ ใ™ใ‚‹ 1 ใคใฎ้…ๅˆ—ไปฅๅค–ใฎๅ€คใ‚’่ฟ”ใ—ใพใ™ใ€‚ใ“ใฎ้–ขๆ•ฐใฏใ€ไปฅไธ‹ใฎๅผ•ๆ•ฐใงๅ‘ผใณๅ‡บใ•ใ‚Œใพใ™ใ€‚

element

้…ๅˆ—ใง็พๅœจๅ‡ฆ็†ไธญใฎ่ฆ็ด ใงใ™ใ€‚

index

้…ๅˆ—ใง็พๅœจๅ‡ฆ็†ไธญใฎ่ฆ็ด ใฎใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใงใ™ใ€‚

array

flatMap() ใŒๅ‘ผใณๅ‡บใ•ใ‚ŒใŸ้…ๅˆ—ใงใ™ใ€‚

thisArg ็œ็•ฅๅฏ

callbackFn ใ‚’ๅฎŸ่กŒใ™ใ‚‹ใจใใซ this ใจใ—ใฆไฝฟ็”จใ™ใ‚‹ๅ€คใงใ™ใ€‚ๅๅพฉๅ‡ฆ็†ใƒกใ‚ฝใƒƒใƒ‰ใ‚’ๅ‚็…งใ—ใฆใใ ใ•ใ„ใ€‚

่ฟ”ๅ€ค

ๅ„่ฆ็ด ใŒใ‚ณใƒผใƒซใƒใƒƒใ‚ฏ้–ขๆ•ฐใฎ็ตๆžœใงใ‚ใ‚Šใ€ๆทฑใ•ใŒ 1 ใซๅนณๅฆๅŒ–ใ•ใ‚ŒใŸๆ–ฐใ—ใ„้…ๅˆ—ใงใ™ใ€‚

่งฃ่ชฌ

flatMap() ใƒกใ‚ฝใƒƒใƒ‰ใฏๅๅพฉๅ‡ฆ็†ใƒกใ‚ฝใƒƒใƒ‰ใงใ™ใ€‚ใ‚ณใƒผใƒซใƒใƒƒใ‚ฏ้–ขๆ•ฐใฎ่ฉณ็ดฐใช่ชฌๆ˜Žใฏ Array.prototype.map() ใ‚’ๅ‚็…งใ—ใฆใใ ใ•ใ„ใ€‚flatMap() ใƒกใ‚ฝใƒƒใƒ‰ใฏใ€map(callbackFn, thisArg) ใฎๅพŒใซใฎ flat(1) ใ‚’ๅ‘ผใณๅ‡บใ™ใฎใจๅŒใ˜ใงใ™ใ€‚่ฆ็ด ใ”ใจใซใ€ๆ–ฐใ—ใ„่ฆ็ด ใฎ้…ๅˆ—ใ‚’็”Ÿๆˆใ—ใ€ใงใใŸ้…ๅˆ—ใ‚’้€ฃ็ตใ—ใฆๆ–ฐใ—ใ„้…ๅˆ—ใ‚’ๅฝขๆˆใ—ใพใ™ใ€‚ใ“ใ‚Œใ‚‰ใฎใƒกใ‚ฝใƒƒใƒ‰ใŒไธ€่ˆฌ็š„ใซใฉใฎใ‚ˆใ†ใซๅ‹•ไฝœใ™ใ‚‹ใฎใ‹ใซใคใ„ใฆใฎ่ฉณ็ดฐใฏใ€ๅๅพฉๅ‡ฆ็†ใƒกใ‚ฝใƒƒใƒ‰ใฎ็ฏ€ใ‚’ใ”่ฆงใใ ใ•ใ„ใ€‚

flatMap() ใƒกใ‚ฝใƒƒใƒ‰ใฏๆฑŽ็”จ็š„ใงใ™ใ€‚ใ“ใ‚Œใฏ this ๅ€คใซ length ใƒ—ใƒญใƒ‘ใƒ†ใ‚ฃใจๆ•ดๆ•ฐใ‚ญใƒผใฎใƒ—ใƒญใƒ‘ใƒ†ใ‚ฃใŒใ‚ใ‚‹ใ“ใจใ ใ‘ใ‚’ๆœŸๅพ…ใ—ใพใ™ใ€‚ใŸใ ใ—ใ€ callbackFn ใ‹ใ‚‰่ฟ”ใ•ใ‚Œใ‚‹ๅ€คใฏใ€ๅนณๅฆๅŒ–ใ™ใ‚‹ๅ ดๅˆใฏ้…ๅˆ—ใงใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“ใ€‚

ไปฃๆ›ฟๆ‰‹ๆฎต

ไบ‹ๅ‰ๅ‰ฒใ‚Šๅฝ“ใฆใจๆ˜Ž็คบ็š„ใชๅๅพฉๅ‡ฆ็†

js
const arr = [1, 2, 3, 4];

arr.flatMap((x) => [x, x * 2]);
// is equivalent to
const n = arr.length;
const acc = new Array(n * 2);
for (let i = 0; i < n; i++) {
  const x = arr[i];
  acc[i * 2] = x;
  acc[i * 2 + 1] = x * 2;
}
// [1, 2, 2, 4, 3, 6, 4, 8]

ใ“ใฎๅ ดๅˆใ€ flatMap ใฎๆ‰‹ๆณ•ใฏ for ใƒซใƒผใƒ—ใฎๆ‰‹ๆณ•ใ‚ˆใ‚Šใ‚‚้…ใ„ใ“ใจใซๆณจๆ„ใ—ใฆใใ ใ•ใ„ใ€‚ใ“ใ‚Œใฏใ€ใ‚ฌใƒ™ใƒผใ‚ธใ‚ณใƒฌใ‚ฏใ‚ทใƒงใƒณใŒๅฟ…่ฆใชไธ€ๆ™‚็š„ใช้…ๅˆ—ใŒ็”Ÿๆˆใ•ใ‚Œใ‚‹ใŸใ‚ใจใ€่ฟ”ใ•ใ‚Œใ‚‹้…ๅˆ—ใฎใ‚ตใ‚คใ‚บใ‚’้ ป็นใซๅค‰ๆ›ดใ™ใ‚‹ๅฟ…่ฆใŒใชใ„ใŸใ‚ใงใ™ใ€‚ใ—ใ‹ใ—ใ€ๆŸ”่ปŸๆ€งใจๅฏ่ชญๆ€งใŒๆฑ‚ใ‚ใ‚‰ใ‚Œใ‚‹ๅ ดๅˆใซใฏใ€ flatMap ใŒๆญฃใ—ใ„่งฃๆฑบ็ญ–ใจใชใ‚‹ๅฏ่ƒฝๆ€งใŒใ‚ใ‚Šใพใ™ใ€‚

ไพ‹

map() ใจ flatMap()

js
const arr = [1, 2, 3, 4];

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

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

// 1ใคใฎใƒฌใƒ™ใƒซใ ใ‘ใŒใƒ•ใƒฉใƒƒใƒˆๅŒ–ใ•ใ‚Œใ‚‹
arr.flatMap((x) => [[x * 2]]);
// [[2], [4], [6], [8]]

ไธŠ่จ˜ใฏ map ใ‚’ไฝฟ็”จใ™ใ‚‹ใ“ใจใงใ‚‚ๅฎŸ็พใงใใพใ™ใŒใ€ใ“ใ“ใงใฏ flatMap() ใฎไฝฟ็”จๆ–นๆณ•ใ‚’ใ‚ˆใ‚Šใ‚ˆใ็คบใ™ไพ‹ใ‚’็ดนไป‹ใ—ใพใ™ใ€‚

ๆ–‡็ซ ใฎใƒชใ‚นใƒˆใ‹ใ‚‰ๅ˜่ชžใฎใƒชใ‚นใƒˆใ‚’็”Ÿๆˆใ—ใฆใฟใพใ—ใ‚‡ใ†ใ€‚

js
const arr = ["it's Sunny in", "", "California"];

arr.map((x) => x.split(" "));
// [["it's","Sunny","in"],[""],["California"]]

arr.flatMap((x) => x.split(" "));
// ["it's","Sunny","in", "", "California"]

ๅ‡บๅŠ›ใƒชใ‚นใƒˆใฎ้•ทใ•ใฏๅ…ฅๅŠ›ใƒชใ‚นใƒˆใฎ้•ทใ•ใจใฏ็•ฐใชใ‚‹ๅ ดๅˆใŒใ‚ใ‚‹ใ“ใจใซๆณจๆ„ใ—ใฆใใ ใ•ใ„ใ€‚

map() ใฎใ‚ขใ‚คใƒ†ใƒ ใฎ่ฟฝๅŠ ใจๅ‰Š้™ค

flatMap ใฏใ€map ไธญใซใ‚ขใ‚คใƒ†ใƒ ใฎ่ฟฝๅŠ ใจๅ‰Š้™ค๏ผˆใ‚ขใ‚คใƒ†ใƒ ใฎๆ•ฐใ‚’ๅค‰ๆ›ด๏ผ‰ใ‚’่กŒใ†ๆ–นๆณ•ใจใ—ใฆๅˆฉ็”จใงใใพใ™ใ€‚ ใคใพใ‚Šใ€ๅธธใซไธ€ๅฏพไธ€ใงใฏใชใใ€ๅคšใใฎใ‚ขใ‚คใƒ†ใƒ ใ‚’ๅคšใใฎใ‚ขใ‚คใƒ†ใƒ ใซ๏ผˆๅ…ฅๅŠ›ใ•ใ‚ŒใŸใ‚ขใ‚คใƒ†ใƒ ใ‚’ๅ€‹ๅˆฅใซๆ‰ฑใ†ใ“ใจใง๏ผ‰ใƒžใƒƒใƒ—ใงใใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚ ใ“ใฎๆ„ๅ‘ณใงใฏใ€ filter ใฎ้€†ใฎใ‚ˆใ†ใชๅƒใใ‚’ใ—ใพใ™ใ€‚ ๅ˜็ด”ใซใ€ใ‚ขใ‚คใƒ†ใƒ ใ‚’ไฟๆŒใ™ใ‚‹ใซใฏ 1 ่ฆ็ด ใฎ้…ๅˆ—ใ‚’่ฟ”ใ—ใ€ใ‚ขใ‚คใƒ†ใƒ ใ‚’่ฟฝๅŠ ใ™ใ‚‹ใซใฏ่ค‡ๆ•ฐ่ฆ็ด ใฎ้…ๅˆ—ใ‚’่ฟ”ใ—ใ€ใ‚ขใ‚คใƒ†ใƒ ใ‚’ๅ‰Š้™คใ™ใ‚‹ใซใฏ 0 ่ฆ็ด ใฎ้…ๅˆ—ใ‚’่ฟ”ใ—ใพใ™ใ€‚

js
// ไพ‹ใˆใฐใ€ใ™ในใฆใฎ่ฒ ใฎๆ•ฐใ‚’ๅ–ใ‚Š้™คใใ€
// ๅฅ‡ๆ•ฐใ‚’ๅถๆ•ฐใจ 1 ใซๅˆ†ๅ‰ฒใ—ใŸใ„ใจใ—ใพใ™ใ€‚
const a = [5, 4, -3, 20, 17, -33, -4, 18];
//         |\  \  x   |  | \   x   x   |
//        [4,1, 4,   20, 16, 1,       18]

const result = a.flatMap((n) => {
  if (n < 0) {
    return [];
  }
  return n % 2 === 0 ? [n] : [n - 1, 1];
});
console.log(result); // [4, 1, 4, 20, 16, 1, 18]

callbackFn ใฎ็ฌฌ 3 ๅผ•ๆ•ฐใฎไฝฟ็”จ

array ๅผ•ๆ•ฐใฏใ€้…ๅˆ—ๅ†…ใฎๅˆฅใฎ่ฆ็ด ใซใ‚ขใ‚ฏใ‚ปใ‚นใ—ใŸใ„ๅ ดๅˆใ€็‰นใซใ€ใใฎ้…ๅˆ—ใ‚’ๅ‚็…งใ™ใ‚‹ๆ—ขๅญ˜ใฎๅค‰ๆ•ฐใŒใชใ„ๅ ดๅˆใซไพฟๅˆฉใงใ™ใ€‚ๆฌกใฎไพ‹ใงใฏใ€ๆœ€ๅˆใซ filter() ใ‚’ไฝฟ็”จใ—ใฆ้‹็”จใ‚นใƒ†ใƒผใ‚ทใƒงใƒณใ‚’ๆŠฝๅ‡บใ—ใ€ๆฌกใซ flatMap() ใ‚’ไฝฟ็”จใ—ใฆใ€ใใ‚Œใžใ‚Œใฎ่ฆ็ด ใŒ้ง…ใจใใฎๆฌกใฎ้ง…ใ‚’ๅซใ‚€ๆ–ฐใ—ใ„้…ๅˆ—ใ‚’ไฝœๆˆใ—ใฆใ„ใพใ™ใ€‚ๆœ€ๅพŒใฎ้ง…ใงใฏใ€ๆœ€็ต‚็š„ใช้…ๅˆ—ใ‹ใ‚‰ใใฎ้ง…ใ‚’้™คๅค–ใ™ใ‚‹ใŸใ‚ใซใ€็ฉบใฎ้…ๅˆ—ใ‚’่ฟ”ใ—ใฆใ„ใพใ™ใ€‚

js
const stations = ["New Haven", "West Haven", "Milford (closed)", "Stratford"];
const line = stations
  .filter((name) => !name.endsWith("(closed)"))
  .flatMap((name, idx, arr) => {
    // arr ๅผ•ๆ•ฐใŒใชใ„ๅ ดๅˆใ€ๅค‰ๆ•ฐใซไฟๅญ˜ใ›ใšใซไธญ้–“้…ๅˆ—ใซ็ฐกๅ˜ใซ
    // ใ‚ขใ‚ฏใ‚ปใ‚นใ™ใ‚‹ๆ–นๆณ•ใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚
    if (idx === arr.length - 1) return []; // ๆŒ‡ๅฎšใ•ใ‚ŒใŸ้ง…ใซๆฌกใฎ้ง…ใŒใชใ„
    return [`${name} - ${arr[idx + 1]}`];
  });
console.log(line); // ['New Haven - West Haven', 'West Haven - Stratford']

array ๅผ•ๆ•ฐใฏใ€ๆง‹็ฏ‰ไธญใฎ้…ๅˆ—ใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ใ‚ณใƒผใƒซใƒใƒƒใ‚ฏ้–ขๆ•ฐใ‹ใ‚‰ๆง‹็ฏ‰ไธญใฎ้…ๅˆ—ใซใ‚ขใ‚ฏใ‚ปใ‚นใ™ใ‚‹ๆ–นๆณ•ใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚

็–Ž้…ๅˆ—ใซๅฏพใ™ใ‚‹ flatMap() ใฎไฝฟ็”จ

map() ใฏๅ‘ผใณๅ‡บใ•ใ‚Œใšใ€ flat() ใฏ่ฟ”ใ™้…ๅˆ—ใฎ็ฉบใฎใ‚นใƒญใƒƒใƒˆใ‚’็„ก่ฆ–ใ™ใ‚‹ใฎใงใ€ callbackFn ใฏๅ…ƒใฎ้…ๅˆ—ใฎ็ฉบใฎใ‚นใƒญใƒƒใƒˆใซๅฏพใ—ใฆใฏๅ‘ผใณๅ‡บใ•ใ‚Œใพใ›ใ‚“ใ€‚

js
console.log([1, 2, , 4, 5].flatMap((x) => [x, x * 2])); // [1, 2, 2, 4, 4, 8, 5, 10]
console.log([1, 2, 3, 4].flatMap((x) => [, x * 2])); // [2, 4, 6, 8]

้…ๅˆ—ไปฅๅค–ใฎใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใซๅฏพใ™ใ‚‹ flatMap() ใฎๅ‘ผใณๅ‡บใ—

flatMap() ใƒกใ‚ฝใƒƒใƒ‰ใฏ this ใฎ length ใƒ—ใƒญใƒ‘ใƒ†ใ‚ฃใ‚’่ชญใฟ่พผใฟใ€ๆฌกใซใ‚ญใƒผใŒ length ใ‚ˆใ‚Šๅฐใ•ใ„้ž่ฒ ใฎๆ•ดๆ•ฐใงใ‚ใ‚‹ๅ„ใƒ—ใƒญใƒ‘ใƒ†ใ‚ฃใซใ‚ขใ‚ฏใ‚ปใ‚นใ—ใพใ™ใ€‚ใ‚ณใƒผใƒซใƒใƒƒใ‚ฏ้–ขๆ•ฐใฎ่ฟ”ใ‚Šๅ€คใŒ้…ๅˆ—ใงใชใ„ๅ ดๅˆใฏใ€ๅธธใซ็ตๆžœใฎ้…ๅˆ—ใซ็›ดๆŽฅ่ฟฝๅŠ ใ•ใ‚Œใพใ™ใ€‚

js
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 } ]

ไป•ๆง˜ๆ›ธ

Specification
ECMAScriptยฎ 2026 Language Specification
# sec-array.prototype.flatmap

ใƒ–ใƒฉใ‚ฆใ‚ถใƒผใฎไบ’ๆ›ๆ€ง

้–ข้€ฃๆƒ…ๅ ฑ