概要: このチュートリアルでは、JavaScript Array の flatMap()
メソッドについて学びます。このメソッドは、配列の各要素をマッピング関数を使用してマップし、結果を新しい配列にフラット化します。
JavaScript Array flatMap() メソッド入門
flat()
メソッドは、サブ配列の要素を連結した新しい 配列 を作成します。
map()
メソッドは、マッピング関数の結果を要素とする新しい配列を作成します。
flatMap()
メソッドは、map()
メソッドを実行した後に深さ 1 の flat()
メソッドを実行するのと同じです。
flatMap()
メソッドは、まずマッピング関数を使用して配列の各要素をマップし、次に結果を新しい配列にフラット化します。
flatMap()
メソッドの構文は以下のとおりです。
let newArray = arrayObject.flatMap(callback,thisArg);
Code language: JavaScript (javascript)
flatMap()
メソッドは2つのパラメータを取ります。
1) コールバックマッピング関数
callback
はマッピング関数であり、map()
メソッドのものと同じ構文を持ちます。
function callback(currentValue [[,index], array]);
Code language: JavaScript (javascript)
2) thisArg 引数
オプションの thisArg
引数は、callback
を実行するときに this
として使用する値です。
flatMap()
メソッドは元の配列を変更しないことに注意してください。
JavaScript Array flatMap() の例
flatMap()
メソッドの使用例をいくつか見てみましょう。
1) 文から単語を作成する例
次のような配列があるとします。
let sentences = ["JavaScript Array flatMap()", " ", "is", " ", "Awesome"];
Code language: JavaScript (javascript)
次の map()
関数は、文の単語を分割します。
let words = sentences.map(s => s.split(' '));
console.log(words);
Code language: JavaScript (javascript)
出力
[
[ 'JavaScript', 'Array', 'flatMap()' ],
[ ' ' ],
[ 'is' ],
[ ' ' ],
[ 'Awesome' ]
]
Code language: JavaScript (javascript)
結果は、単語で埋められたネストされた配列の配列です。結果をフラット化するには、map()
メソッドの結果に対して flat()
メソッドを使用できます。ただし、flatMap()
メソッドを使用する方がより簡潔です。
flatMap()
は、配列内の各文をマッピング関数で実行し、マップされた結果をフラット化することで、フラット化された配列を作成します。
let sentences = [
"JavaScript Array flatMap()",
" ",
"is",
" ",
"Awesome"
];
let words = sentences.flatMap(s => s.split(' '));
console.log(words);
Code language: JavaScript (javascript)
出力
[ 'JavaScript', 'Array', 'flatMap()', '', '', 'is', '', '', 'Awesome' ]
Code language: JSON / JSON with Comments (json)
2) マッピング中に要素を追加および削除する例
flatMap()
メソッドを使用すると、マッピング中に要素を追加または削除できます。次の例を考えてみましょう。
次のようなショッピングカートがあるとします。
let cart = [{
name: 'Smartphone',
qty: 2,
price: 500,
freeOfCharge: false
},
{
name: 'Tablet',
qty: 1,
price: 800,
freeOfCharge: false
}
];
Code language: JavaScript (javascript)
顧客がスマートフォンを購入した場合、無料のスクリーンプロテクターをプレゼントしたいとします。
顧客がカートにスマートフォンを追加すると、次のように flatMap()
メソッドを使用してカートにスクリーンプロテクターを追加できます。
let newCart = cart.flatMap(
(item) => {
if (item.name === 'Smartphone') {
return [item, {
name: 'Screen Protector',
qty: item.qty,
price: 5,
freeOfCharge: true
}]
} else {
return [item];
}
}
);
console.log(newCart);
Code language: JavaScript (javascript)
カートは次のようになります。
[
{ name: 'Smartphone', qty: 2, price: 500, freeOfCharge: false },
{ name: 'Screen Protector', qty: 2, price: 5, freeOfCharge: true },
{ name: 'Tablet', qty: 1, price: 800, freeOfCharge: false }
]
Code language: JavaScript (javascript)
以下は、reduce()
メソッドを使用して、カート内のアイテムから合計金額を計算する例です。スクリーンプロテクターのような無料アイテムは無視されます。
const total = newCart.reduce((sum, item) => {
if (!item.freeOfCharge)
sum += item.price * item.qty;
return sum;
}, 0);
console.log({total});
Code language: JavaScript (javascript)
出力
{ total: 1800 }
Code language: JavaScript (javascript)
まとめ
flatMap()
メソッドを使用して、コレクション内の各要素をマッピング関数で実行し、マップされた結果をフラット化することで、要素のフラット化された配列を作成します。